2010-03-09 12 views
6
void main() 
{ 
    if (fork()) 
    { 
     printf ("PID1 %d\n", getpid()); 
    } 
    else 
    { 
     printf ("PID2 %d\n", getpid()); 
    } 
} 

Cosa fa questo codice? So che ha qualcosa a che fare con gli ID di processo, ma non dovrebbe restituire qualcosa nella condizione per determinare se si tratta di un processo figlio/genitore?c - fork() codice

+5

Hai bisogno di tag 'compiti a casa'? –

risposta

16

In generale si tratta di:

pid_t pid = fork(); 
if(pid == 0) { 
    //child 
} else if(pid > 0) { 
    //parent 
} else { 
//error 
} 

La pagina man dice:

RETURN VALUE 
    Upon successful completion, fork() shall return 0 to the child 
    process and shall return the process ID of the child process to the 
    parent process. Both processes shall continue to execute from 
    the fork() function. 
    Otherwise, -1 shall be returned to the parent process, no child process 
    shall be created, and errno shall be set to indicate the error. 
+0

Ahh ok grazie. Modifica: Sì, vedo molti esempi come questo, quindi perché mi sono confuso. – tm1

+0

if (fork()) // se fork riuscito ...................... printf ("PID1% d \ n", getpid()); // print parentID ...................... else printf ("PID2% d \ n", getpid()); // print child id – tm1

+0

È giusto? Spiacente, non conosco i tag del codice. – tm1

-2

Il valore di ritorno di fork() indica se il processo è il genitore o il bambino. Quindi il bambino stamperà sempre "PID2 0", perché se fork() restituisce 0, viene eseguita la seconda parte dell'istruzione if.

+1

non 'getpid()' restituisce il PID attuale del processo corrente, non importa cosa restituisce 'fork()'? –

+0

@SF: mi sembra giusto. –

3

Il codice precedente crea un nuovo processo quando esegue la chiamata a forcella, questo processo sarà una copia quasi esatta del processo originale. Entrambi i processi continueranno a essere eseguiti in modo seprocciuto al modulo di risposta, la chiamata a forcella che fa sorgere la domanda "Come faccio a sapere se il nuovo processo o quello vecchio?" dal momento che sono quasi identici. Per fare ciò i progettisti di fork hanno fatto in modo che la chiamata a fork restituisca cose diverse in ogni processo, nel nuovo processo (il figlio) la chiamata a fork restituisce 0 e il fork processo originale (il genitore) restituisce l'ID del nuovo processo in modo che il genitore possa interagire con esso.

Quindi nel codice la chiamata a forcella crea un processo figlio, entrambi i processi eseguono l'istruzione if in modo sepa- rato. Nel genitore il valore di ritorno non è zero, quindi il genitore esegue l'istruzione if. Nel bambino il valore di ritorno è 0, quindi fa la dichiarazione else. Spero che questo aiuti :-)