2010-02-24 14 views
40

Considerate questo frammento di codice:come uscire da un processo figlio - _exit() vs. uscita

pid_t cpid = fork(); 

if (cpid == -1) { 
    perror("fork"); 
    exit(EXIT_FAILURE); 
} 

if (cpid == 0) { // in child 
    execvp(argv[1], argv + 1); 
    perror("execvp"); 
    _exit(EXIT_FAILURE); 
} 

// in parent 

Come farò a uscire dal processo figlio se i rendimenti execvp? Devo usare exit() o _exit()?

risposta

46

Si consiglia di utilizzare _Exit(). exit() chiama le funzioni aggiunte con atexit() ed elimina i file creati con tmpfile(). Dal momento che il processo genitore è quello che vuole veramente fare queste cose quando esiste, dovresti chiamare lo _Exit(), che non fa nulla di tutto ciò.

Avviso _Exit() con una capitale E. _exit(2) probabilmente non è ciò che si desidera chiamare direttamente. exit(3) e _Exit(3) chiameranno questo per te. Se non si dispone di _Exit(3), allora sì, _exit() è quello che volevi.

+3

+1 Si desidera che il processo figlio non riuscito esca quietamente come se non fosse mai stato creato. –

+2

Poichè il vecchio standard C consentiva al linker di risolvere senza distinzione tra maiuscole e minuscole _Exit() non può essere una funzione di libreria standard in quanto sarebbe in conflitto con il più vecchio _exit(). Scusate. – Joshua

+7

Al contrario. _Exit (3) è una libreria C standard (ISO C99). _exit (2) è una chiamata di sistema POSIX.1 e non uno standard C. –

3

execvp uscirà dal bambino in caso di esito positivo in modo da non dover uscire.

In caso di errore, utilizzare semplicemente exit(EXIT_FAILURE); nel figlio.

Edit: ho scoperto che dopo alcune ricerche: http://www.unixguide.net/unix/programming/1.1.3.shtml

quindi è sembra che sia meglio usare _exit() in un bambino forchetta specialmente quando ci si trova in C++: p Grazie per la tua domanda ho imparato una cosa: D

+0

(exit è indipendente dal sistema operativo) e quando si usa _exit()? – helpermethod

1

Dipende dal comportamento desiderato: man -s 3 exit e man _exit per ulteriori dettagli sul sistema. In generale, credo che _exit non esegua funzioni che sono registrate con atexit() mentre exit fa (queste funzioni meglio non chiamano exit - altrimenti si ottiene la ricorsione).

In generale, preferirei uscire su _exit tranne che nelle funzioni registrate con atexit, in quelle che chiamerei _exit, se necessario.

15

Il figlio di fork() deve sempre chiamare _exit().

Chiamare exit() è invece un buon metodo per causare lo svuotamento dei buffer di stdio in sospeso due volte.

+1

exec non restituisce eccetto per errore, in cui si chiama _exit. – Joshua

0

exit() è una funzione ANSI-C e pertanto è indipendente dal sistema operativo. Chiude tutte le funzioni standard ANSI-C. _exit() è chiamato da exit() per chiudere le funzionalità dipendenti dal sistema operativo, perché exit() ha idea su di loro.

+0

"_exit() è una funzione del kernel di Linux" non è corretta, vedi http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html –

+0

Hai ragione, ma il resto del mio commento è vero . Vedi: Unix Systems Programming di David Curry, pagina 291. – ImanKh

Problemi correlati