Sto imparando ad utilizzare la funzione fork() perciò ho fatto un semplice programmino, in breve fa questo:
1-prende un valore qt da linea di comando
2-crea qt processi figli stampando una frase che mostra a video la loro effettiva creazione
3-per ogni figlio creato viene salvato il PID in un array
4-stampa l'elenco dei figli creati
Codice PHP:
int sezionePadre(int figli[], int nFiglio, int pid) //funziona eseguita dal processo padre per qt volte
{
printf(" "); // ********
figli[nFiglio]=pid;
return 0;
}
int sezioneFiglio() //funzione eseguita solo dai figli
{
printf("Sono %d, il figlio di %d\n", (int)getpid(), (int)getppid());
return 0;
}
int main(int argc, char** argv)
{
int qt=atoi(argv[1]); //numero di figli da creare
int i;
int figli[qt]; //array che conterrà i PID dei figli creati
int pid;
int ret=1; //valore che ritornerà alla fine del processo padre
for(i=0; i<qt; i++)
{
pid=(int)fork();
if(pid==0) return sezioneFiglio();
else if(pid>0) ret = sezionePadre(figli, i, pid);
else printf("Errore\n");
}
if(ret!=0) return ret;
for(i=0; i<qt; i++) wait(); // attende la fine di tutti i qt processi figli
// Stampa l'elenco dei figli
printf("Sono %d, il padre di ", (int)getpid());
for(i=0; i<qt; i++)
printf("%d ", figli[i]);
printf("\n");
return ret;
}
Ora il programma funziona correttamente tranne per la stampa finale dei figli, infatti il primo figlio risulta sempre avere PID=0, il tutto si corregge mettendo un semplice printf(" ") in sezionePadre come quello che ho inserito con il commento // ********
si corregge anche con uno sleep(1), insomma mi basta ritardare un minimo la funzione sezionePadre, ma come mai succede questo?