2012-09-04 21 views
5

Ho letto la precedente domanda Differences between fork and exec ma mi ha lasciato alcuni dubbi.fork(), exec e waitpid()

Quando si utilizza fork() e si chiama exec su un figlio, il nuovo processo creato da exec è ancora un bambino giusto?

L'uccisione del processo padre uccide anche il bambino?

Nel disegno/Nell'esempio mostrato in the top answer, egli chiama wait/waitpid perché se il processo padre termina prima, il processo figlio muore e poi si ottiene parziale o nessuna uscita per il comando ls, è corretto?

+0

ah, stavo pensando a HUP. –

risposta

2

Killing the parent process non uccidere il bambino. Quando il processo figlio chiama una funzione exec, è ancora un processo figlio.

Nell'esempio della domanda collegata, il diagramma di flusso descrive approssimativamente il processo utilizzato da una shell per richiamare i comandi. A meno che il comando non sia stato ripristinato, la shell - il processo genitore - attenderà che il processo figlio termini prima di continuare a leggere i comandi. Altrimenti non sarebbe necessario attendere il bambino.

Vedere anche this question.

3

exec sostituisce l'immagine di processo attualmente in esecuzione con una nuova. Quindi sì, il bambino è un processo figlio (è in realtà lo stesso processo.)

No, uccidere il genitore non uccide il bambino (il bambino è orphaned).

2

Quando si utilizza fork() e si chiama exec su un figlio, il nuovo processo creato da exec è ancora un bambino giusto?

Quando si chiama exec sul bambino il nuovo processo viene gestito dal bambino. Il processo del bambino viene sostituito dalla chiamata exec.

L'uccisione del processo padre uccide anche il bambino?

È possibile che il processo figlio muoia quando il processo padre muore (almeno in Linux) facendo sì che il sistema operativo invii un segnale, ma altrimenti sopravvive.

lui chiama attesa/waitpid perché se il processo padre termina prima, il processo figlio muore e poi si ottiene parziale o nessuna uscita per il comando ls , è corretto?

Che ci si vuole attendere che il processo figlio (come nell'esempio si indicò) in modo che: a) si può terminare correttamente il processo figlio quando hai finito b) il processo figlio ha accesso a tutti le risorse del genitore ... significa che se il tuo bambino ha un handle di file aperto dal genitore e il genitore esce, ma il bambino presuppone che il file sarà aperto fino a quando è in esecuzione, accadrà cose cattive.

Date un'occhiata a questo rapido esempio: primo luogo, guardare l'output di un elenco processo:

[email protected]:~> ps 
PID TTY   TIME CMD 
18577 pts/2 00:00:00 bash 
18643 pts/2 00:00:00 ps 

Poi gestiscono questo piccolo programma:

void main() 
{ 
    if(fork()){ 
     printf("parent print"); 
    } 
    else 
     while(1); 
    printf("done"); 
} 

Qui avrete la genitore stampa il messaggio "genitore" quindi "fatto". Controllare un elenco "ps" quando è fatto e vedrete un nuovo processo nella struttura di appendere fuori:

[email protected]:~> ps 
PID TTY   TIME CMD 
18577 pts/2 00:00:00 bash 
18673 pts/2 00:00:02 a.out 
18678 pts/2 00:00:00 ps 

Questo a.out è il bambino, seduto per sempre nel ciclo while, mentre il genitore terminato.

+1

"Quando si chiama exec sul figlio, il nuovo processo viene gestito dal bambino. La procedura del bambino viene sostituita dalla chiamata exec e viene rimessa al termine. "No: il richiamo di exec non crea un nuovo processo. È sempre lo stesso processo figlio. Ciò che 'exec' fa è sostituire il codice e i dati del processo. Non so cosa intendi per "rimandare quando è fatto", non riesco a pensare a nulla che si adatti a questa descrizione. – Gilles

+0

@Gilles La modifica è utile? – Mike

+0

No: a quale "percorso di esecuzione originale" si riferisce? Quando ciò che è fatto? – Gilles

2
.. the new process created by exec is still a child right? 

Sì, è ancora il bambino.

Does killing the parent process kills the child too? 

No. Se il padre muore per qualsiasi motivo e il bambino è ancora in esecuzione, allora il bambino sarà adottato dal (ID = 1 di processo) processo init process che diventerà il nuovo genitore di questa orphan process.

calls wait/waitpid because if the parent process terminates first, the child... 

waitpid/wait è per notificare lo stato del bambino al genitore. Si noti che, se il processo padre ha molti figli, di solito attende qualsiasi figlio a meno che non si specifichi l'ID di processo di un particolare bambino.

+1

più punti per menzionare init :) – user1644340