2010-11-17 13 views

risposta

6

Se leggi, costruisci ed esegui il seguente programma dovresti avere una migliore idea di cosa sta succedendo.

#include <stdio.h> 
#include <unistd.h> 

int main(void) { 
    pid_t fk; 

    printf("\tbefore fork my pid = %lu\n", (unsigned long)getpid()); 

    fflush(stdout); /* This may keep the above print 
         statement from outputing twice. */ 

    fk = fork(); /* The OS kernel makes a copy of the current process here */ 

    printf("fork returned %lu and now my pid = %lu\n", 
         (unsigned long)fk, (unsigned long)getpid()); 

    return 0; 
} 

La ragione per cui la fflush(stdout) è necessario è che, poiché il processo è ripetuto dalla forcella che significa che il buffer fatto per stdout da stdio viene duplicato pure. Il "\ n" alla fine di quella prima stampa può far andare avanti e svuotare lo stdout, ma questo non è garantito.

18

La funzione di fork restituisce 0 al processo figlio che è stato creato e restituisce l'ID childs al processo padre.

I due processi separati restituiscono ciascuno un valore singolo.

Quindi pensateci più come un ritorno viene chiamato su ogni processo thread.

+7

Un ritorno per ogni processo, non thread. –

5

fork non restituisce due valori. Subito dopo una chiamata di sistema fork hai semplicemente due processi indipendenti che eseguono lo stesso codice, e il pid restituito da fork è l'unico modo per distinguere in quale processo sei - genitore o figlio.

12

Come Gnostus dice, la funzione fork() non restituisce due valori.

Quello che fa è restituire un valore singolo, come tutte le funzioni, ma restituisce due volte.

Una volta all'interno del processo padre e una volta all'interno del bambino. Il processo genitore ottiene l'ID di processo del figlio restituito, il bambino ottiene 0 - un ID di processo non valido, quindi il codice può dire che è il figlio.

Il figlio è un nuovo processo, esegue lo stesso codice e si trova nello stesso punto del codice del genitore che lo ha generato.

int cProcessID; 

cProcessID = fork(); 

if (cProcessID == 0) { 
    // Child process 
} else { 
    // Parent process 
} 
6

L'intuizione chiave qui è di pensare al fatto che dopo un fork() hai davvero due copie del tuo programma. Si tratta di due processi, che eseguono la stessa copia esatta del codice e il puntatore di esecuzione si trova esattamente sulla stessa riga di codice, ovvero fork(), pronto a tornare.

Il sistema operativo consente al fork() di ritornare nel processo padre con il pid del figlio e di farlo tornare nel processo figlio con zero (se le cose vanno bene).

Ecco perché si dice che fork() restituisce due volte. Una volta in ogni processo

Problemi correlati