2012-01-14 23 views
5
void child(int pid){ 
    printf("Child PID:%d\n",pid); 
    exit(0);  
} 
void parent(int pid){ 
    printf("Parent PID:%d\n",pid); 
    exit(0); 
} 

void init(){ 
    printf("Init\n");//runs before the fork 
} 


int main(){ 

    init();//only runs for parent i.e. runs once 
    printf("pre fork()");// but this runs for both i.e. runs twice 
    //why??? 

    int pid = fork(); 

    if(pid == 0){ 
     child(pid); //run child process 
    }else{ 
     parent(pid);//run parent process 
    } 
    return 0; 
} 

uscita:Il sistema Unix fork() chiama quando viene eseguito?

Init 
pre fork()Parrent PID:4788 
pre fork()Child PID:0 

Ho un processo in un sistema operativo Unix (Ubuntu nel mio caso). Non posso per la vita di me capire come funziona. So che la funzione fork() divide i miei programmi in due processi ma da dove? Crea un nuovo processo ed esegue di nuovo l'intera funzione principale, e in caso affermativo, perché il init() viene eseguito solo una volta e lo printf() due volte?

Perché il printf("pre fork()"); viene eseguito due volte e la funzione init() una sola volta?

risposta

22

C'è solo un processo fino alla forcella. Cioè, quel percorso viene eseguito solo una volta. Dopo il fork ci sono 2 processi quindi il codice che segue quella chiamata di sistema viene eseguito da entrambi i processi. Quello che ignori è che entrambi terminano ed entrambi chiameranno exit.

Nel tuo codice non stai scaricando stdio. Quindi entrambi i processi lo fanno (exit flushes stdio buffers) - ecco perché vedi quell'output.

Prova questo:

printf("pre fork()\n"); 
        ^^ should flush stdout 

O forse

printf("pre fork()\n"); 
fflush(stdout); 
+0

Thanks a lot. davvero utile: D – boogie666

+0

Wow, questo è così sottile! +1 da me! –

+2

Inserire semplicemente una nuova riga non necessariamente svuota il buffer. Esegui il codice con lo stdout reindirizzato a un file normale e vedrai esattamente lo stesso comportamento. stdout è * not * line buffered di default a meno che non sia un tty. –

Problemi correlati