View Full Version : [C] Spiegazione fork()
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!
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.
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! :)
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:
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.
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.