|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Feb 2015
Messaggi: 5
|
[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 Codice:
#include <stdio.h>
int main()
{
printf("Ciao,");
fork();
printf("mondo!\n");
return 0;
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
|
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: Feb 2015
Messaggi: 5
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Feb 2015
Messaggi: 5
|
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()
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12961
|
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: Codice:
Flusso A | Flusso B
---------------------------
printf("ciao") |
fork() |
printf("mondo") | printf("mondo") // dopo la fork
Per evitare questo, devi controllare il PID e separare il comportamento del padre dal comportamento del figlio. Ultima modifica di WarDuck : 18-02-2015 alle 20:27. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:53.




















