Cómo salir de un proceso hijo y volver a su estado de execvp ()?
Pregunta
En mi sencilla carcasa a medida que estoy leyendo comandos de la entrada estándar y ejecutarlos con execvp (). Antes de esto, creo un tenedor del proceso actual y que llamo el execvp () en ese proceso hijo, justo después de eso, llamo a la salida (0).
Algo como esto:
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
// CHILD PROCESS CODE GOES HERE...
execvp(pArgs[0], pArgs);
exit(0);
} else {
// PARENT PROCESS CODE GOES HERE...
}
Ahora, los comandos se ejecutan con execvp () puede devolver errores correctos? Quiero manejar correctamente y que en este momento, siempre estoy llamando a exit (0), lo que significa que el proceso hijo siempre tendrá un estado "OK".
¿Cómo puedo devolver el estado correcto de la execvp () llamar y lo puso en la salida () llamar? ¿Debo obtener el valor int que execvp () devoluciones y pasarlo como una salida () argumento en lugar de 0. ¿Es eso suficiente y correcta?
Solución
Es necesario utilizar waitpid(3)
o wait(1)
en el código de los padres que esperar a que el niño para salir y obtener el mensaje de error.
La sintaxis es:
pid_t waitpid(pid_t pid, int *status, int options);
o
pid_t wait(int *status);
status
contiene el estado de salida. Mire la rel="noreferrer"> href="http://linux.die.net/man/2/waitpid" para ver cómo analizarlo.
Tenga en cuenta que no se puede hacer esto desde el proceso hijo. Una vez que se llama a execvp
el proceso hijo muere (para todos los propósitos prácticos) y es sustituyen por el proceso exec
'd. La única manera que puede llegar a exit(0)
no se si execvp
misma falla, pero entonces el fracaso no se debe a que el nuevo programa terminó. Es porque nunca corrió para empezar.
Editar el proceso hijo no realmente morir. El PID y el medio ambiente se mantienen sin cambios, pero todo el código y los datos se sustituyen con el proceso exec
'd. Puede contar con no regresar al proceso hijo original, a menos exec
falla.
Otros consejos
A partir de su pregunta es un poco difícil de entender lo que está pidiendo. Así que voy a tratar de cubrir un par de los temas relacionados con:
-
execvp()
bien no devuelve (en caso de éxito), o devuelve un error. Es decir, su código de niño sólo necesita manejar condiciones de error. Su código niño debe capturar el resultado deexecvp()
y utilizar ese valor enexit()
como usted sugiere. Su código de niño nunca debería devolver 0, ya que el único éxito significa que elexecvp
trabajó y que processs devolverá 0 (o no). - El padre puede obtener información sobre el niño de
waitpid()
es el código de salida. Hay varias macros definidas para sacar información a partir del parámetrostatus
devuelto. Destaca por su propósito sonWIFEXITED
decirle si el niño sale de "normalmente", yWEXITSTATUS
para obtener el estado del niño como pasó aexit()
. Vea la página dewaitpid
para otras macros.
Uso wait()
o waitpid()
en el proceso padre. Un ejemplo aquí: Código de retorno al sistema operativo mata a su proceso de .
Además, cuando un niño muere la señal SIGCHLD
se envía al proceso padre.