PDA

View Full Version : [C unix] fork


stella_650
20-06-2008, 09:45
ciao a tutti, ho bisogno di capire come fare per risolvere un problema.
Devo svolgere un esercizio e mi sono bloccata nella prima parte...precisamente un padre crea N processi figli con N pari e ciascun processo figlio č identificato da una variabile intera (i=0...N-1); poi continua...ma sn ferma qui.
Ho scritto questa prima parte di codice ma non mi funziona...in output ottengo + pid[i] del dovuto e non so per quale motivo.
Qualcuno potrebbe dirmi come posso risolvere questo problema e perchč cosė nn va?


#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>
int N;
int main(int argc, char *argv[])
{
pid_t pid[N];
int i;
if(argc!=2)
{
printf("Errore nell'utilizzo del programma!\n");
printf("./es1_1411 <N>\n");
exit(-1);
}
N=atoi(argv[1]);
if((N%2)==0)
printf("Il numero (N) inserito č pari: %d\n",N);
else
{
printf("Il numero (N) inserito č dispari: %d\n",N);
printf("Cio' comporta l'uscita dal programma...\n");
exit(-2);
}
i=0; //Parte critica!
while(i<N)
{
pid[i]=fork();
if(pid[i]==0)
{
printf("pid[%d]: %d\n",i,getpid());
}
i++;
}
return 0;
}

ilsensine
20-06-2008, 10:21
Hai fatto un piccolo errore, nel tuo codice anche i child continuano il ciclo while e a loro volta si mettono a forkare e creare altri child.

stella_650
20-06-2008, 10:35
mmm...come devo migliorare il codice per farsė che cio' nn avvenga?

ilsensine
20-06-2008, 10:39
Usa break per uscire dal ciclo. Qualcosa del genere:

for (i=0; i<N; ++i)
if ((pid[i] = fork()) == 0)
break;
else
printf("Creato child: pid[%d]=%d\n", i, pid[i]);

stella_650
20-06-2008, 15:45
grazie mille...avrei un'altra domanda da porre in relazione ai processi...
In particolare, se io genero due processi figli che eseguono due compiti, come faccio a stabilire chi termina per primo e notificare il tutto con un segnale tra processi?

-genero figlio 1 e fa qualcosa
-genero figlio 2 e fa qualcosa
-stabilire chi termina per primo?
-notificare questo evento?

Grazie...in anticipo

ilsensine
20-06-2008, 15:52
Quando un child termina, il padre riceve un SIGCHLD. V. man sigaction per come gestirlo e ricavare il pid.