Ciao a tutti,
sono alle prese con un esercizio in C per l'università in cui da un file di testo contente dei nomi devo generare un processo per ogni nome.
Nessun problema in particolare se non che nelle specifiche avevo la richiesta di mettere una fork in ciclo con condizione di terminazione feof() sullo stream del file.
Ho realizato un programma del tipo:
//inizializzo le variabili e lo stream sul file di testo
......
......
while(!feof(stream))
{
fgets(nome, 30, stream);
/*eseguo la fork*/
sono_il_padre=fork();
if(sono_il_padre)
{
printf("Processo Padre -> ciclando per generazione figli\n");
fflush(stdout);
sleep(3);
}
else
{
printf("Processo figlio - %s\n", nome);
fflush(stdout);
printf("%s -> PID: %d\n", nome, getpid());
fflush(stdout);
printf("%s ->Pid di mio Padre: %d\n", nome, getppid());
fflush(stdout);
sleep(2);
printf("%s -> Muoio subito\n", nome);
fflush(stdout);
sleep(1);
exit(0);
}
....
....
//metto in wait il processo padre per attendere eventuali terminazioni in ritardo
//chiudo lo stream
return(0);
}
questa soluzione funzionava tranne quando il ciclo arrivava all'ultima riga del file sul quale ciclava una seconda volta creando un processo in più, con un pid diverso dal precedente e con il pid del padre corretto.
Pertanto su un file di 5 righe mi creava 6 processi; i, valori del feof erano correttamente a 0 fino alla penultima riga, quando arrivava all'ultima al primo passaggio sull'ultima riga il valore era ancora a 0 mentre a quello successivo era finalmente ad 1 e pertanto si poteva fermare!
Non ho capito come mai non metteva il feof a 1 già al primo spostamento sull'ultima riga!
Successivamente ho risolto eliminando la terminazione del while basata sulla feof()ma vi ho spostato direttamente la fgets(....) in questo modo
while(fgets(nome, 30, stream))
Tuttavia rimango col dubbio sul perchè la prima versione non funzionava, mi sapreste dare una mano? Giusto perchè potrebbe ricapitarmi una situazione analoga e vorrei capire cosa non andava bene.
Grazie a tutti,
Fabio