PDA

Visualizza la versione completa : [C]-Problema feof() fgets() in esercizio sulle fork


febius
13-05-2008, 18:45
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

frznn
13-05-2008, 19:54
credo che il motivo sia questo: la fgets legge i caratteri fino a raggiungere il carattere \n, e lì si ferma. EOF si trova dopo l'ultimo carattere, quindi la feof ritorna 0 perchè sta una posizione prima dell'EOF. alla successiva iterazione leggerà EOF e tornerà 1.

Magari puoi provare a verificare questa cosa mettendo all'ultima iterazione (se sai il numero di linee puoi usare un semplice contatore) una fgetc dopo la fgets.

febius
16-05-2008, 14:47
Grazie, in effetti era proprio quello il problema, ho fatto che mettere direttamente la fgets come condizione di terminazione del while che tutto e' andato a posto....
Ora mi trovo pero' di fronte ad un altro problema:

ho realizzato questo esercizio su linux ubuntu 8.04, e tutto funziona terminando correttamente alla fine del file di testo quando non vi sono piu' processi da creare.
Provo poi a compilare ed eseguire il programma sulle macchine dell'universita', che montano Solaris 10, e accade che compila ma non esegue correttamente. Nel senso che una volta che il ciclio e' arrivato alla fine del file, ricomincia a creare processi da capo a partire dalla seconda iterazione (dalla seconda riga del file di testo) e cosi' via e va avanti all'infinito!
Potrebbe essere un problema di puntatori, non so, forse i valori di ritorno dela fgets, non ci sto capendo un granche'.
Sapevo che sviluppando su linux prima o poi su solaris avrei avuto dei problemi in esecuzione ma non pensavo gia' da subito nei primi esercizi.
Sapreste darmi ancora un aiutino? Grazie

Fabio

Loading