PDA

View Full Version : [C] Spiegazione fork()


x893
17-02-2015, 18:57
Ciao ragazzi, sto cercando di capire come agisce la funzione fork().. Ho capito che la funzione sdoppia se stessa in due processi.
Funzione figlio: funzione che ha come valore di ritorno 0.
Funzione padre: funzione che ha come valore di ritorno il PID del figlio.
Non capisco però perchè questo codice


#include <stdio.h>

int main()
{
printf("Ciao,");
fork();
printf("mondo!\n");
return 0;
}

da come output Ciao, mondo! Ciao, Mondo anzicchè Ciao, mondo! mondo!

VICIUS
17-02-2015, 20:49
Probabilmente è dovuto al fatto che la printf non stampa a video il messaggio immediatamente. La stringa viene messa da parte in memoria in attesa di un '\n'. La fork copia il buffer con "Ciao," anche nel processo figlio. Se privi a mettere un fflush(stdout); prima della fork dovresti ottenere l'output che cerchi.

x893
17-02-2015, 21:07
Probabilmente è dovuto al fatto che la printf non stampa a video il messaggio immediatamente. La stringa viene messa da parte in memoria in attesa di un '\n'. La fork copia il buffer con "Ciao," anche nel processo figlio. Se privi a mettere un fflush(stdout); prima della fork dovresti ottenere l'output che cerchi.

Non cerco nessun output, era solo per capire come funziona fork() e non mi tornava.. Comunque hai ragione, se lo mando a capo anche dopo ciao effettivamente ottengo il risultato che mi aspettavo! Grazie! :)

x893
17-02-2015, 21:08
Quindi la fork copia in memoria tutto quello che c'è nel buffer fino a quel momento? Io avevo capito che la funzione si sdoppiasse dalla riga in poi in cui è invocata la fork() :confused: :confused:

VICIUS
17-02-2015, 21:21
La fork crea un nuovo processo che è una copia esatta di quello di partenza tranne per un paio di piccole differenze. Il buffer in cui viene salvato l'output è solo una delle tante cose che vengono copiate.

WarDuck
18-02-2015, 19:24
Come dice Vicius, il processo è una copia esatta (più o meno).

Ma attenzione, copi anche le istruzioni (quelle dopo la fork).

In particolare succede questo:



Flusso A | Flusso B
---------------------------
printf("ciao") |
fork() |
printf("mondo") | printf("mondo") // dopo la fork


Dunque dal punto della fork in poi hai 2 flussi che eseguono le stesse istruzioni.

Per evitare questo, devi controllare il PID e separare il comportamento del padre dal comportamento del figlio.