2010-02-24 6 views
40

Considere este fragmento de código:cómo salir de un proceso hijo - _exit() frente a la salida

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 

¿Cómo tengo salir del proceso de niño si vuelve execvp? ¿Debo usar exit() o _exit()?

Respuesta

46

Definitivamente, debe usar _Exit(). exit() llama a las funciones que agregó con atexit() y elimina los archivos creados con tmpfile(). Dado que el proceso principal es realmente el que quiere hacer estas cosas cuando existe, debe llamar al _Exit(), que no hace nada de esto.

Aviso _Exit() con una E.Emayúscula probablemente no es lo que desea llamar directamente. exit(3) y _Exit(3) lo llamarán por usted. Si no tiene _Exit(3), entonces sí, _exit() es lo que quería.

+3

+1 Desea que el proceso secundario fallido salga silenciosamente como si nunca se hubiera creado. –

+2

Bueno, ya que el antiguo estándar C permitía al enlazador resolver mayúsculas y minúsculas _Salir() no puede ser una función de biblioteca estándar, ya que entraría en conflicto con el antiguo _exit(). Lo siento. – Joshua

+7

Al contrario. _Exit (3) es una biblioteca C estándar (ISO C99). _exit (2) es una llamada de sistema POSIX.1 y no un estándar de C. –

3

execvp saldrá del elemento secundario si tiene éxito, por lo que no tiene que salir.

En el fallo de ejecución, simplemente uso exit(EXIT_FAILURE); en el niño.

Editar: i encontró que después de algunas investigaciones: http://www.unixguide.net/unix/programming/1.1.3.shtml

por lo que es parece que es mejor utilizar _exit() en un niño tenedor especialmente cuando se encuentra en C++: p Gracias por su pregunta he aprendido algo: D

+0

(exit es independiente del sistema operativo) Y cuando usas _exit()? – helpermethod

1

Depende del comportamiento que desee: man -s 3 exit y man _exit para obtener más información sobre su sistema. En general, creo que _exit no ejecuta funciones registradas con atexit(), mientras que exit lo hace (estas funciones mejor no llaman a exit; de lo contrario, se obtiene recursividad).

En general, preferiría salir por encima de _exit excepto en las funciones registradas con atexit, en las que llamaría _exit, si fuera necesario.

15

El elemento secundario de fork() siempre debe llamar a _exit().

La salida de llamada() en su lugar es una buena manera de hacer que los búferes de stdio pendientes se vacíen dos veces.

+1

exec no se devuelve excepto por error, en el que se llama _exit. – Joshua

0

exit() es una función ANSI-C y, por lo tanto, es independiente del sistema operativo. Cierra todas las funciones estándar de ANSI-C. _exit() es llamado por exit() para cerrar funcionalidades dependientes del sistema de explotación, debido exit() no tiene ni idea acerca de ellos.

+0

"_exit() es una función del kernel de Linux" no es correcto, consulte http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html –

+0

Tiene razón al respecto, pero el resto de mi comentario es cierto . Ver: Programación de Sistemas Unix por David Curry, página 291. – ImanKh

Cuestiones relacionadas