He entendido que: 1) waitpid se utiliza para esperar la muerte de un niño y luego recoger el SIGCHLD y el estado de salida del niño, etc. 2) Cuando tenemos un manejador de señal para SIGCHLD, hacemos algunas cosas más relacionado con la limpieza del niño u otras cosas (hasta el programador) y luego haga un waitpid para que el niño no se vuelva zombie y luego regrese.¿Usando waitpid o sigaction?
Ahora, ¿necesitamos tener ambos 1 y 2 en nuestros programas cuando hacemos un fork/exec y el niño regresa? Si tenemos tanto, la SIGCHLD se obtiene en primer lugar, por lo que el manejador de la señal se llama primero y por tanto su waitpid se llama éxito y no el waitpid en el código del proceso padre de la siguiente manera:
my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}
int main()
{
sigaction(SIGCHLD, my_signal_handler_for_sigchld)
fork()
if (child) //do something, return
if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
Apreciar si alguien me ayuda Entienda esto.
Hola, gracias por tu respuesta.Pero lo que realmente estaba buscando es: cuando tengo sig_handler y waitpid en el proceso padre, sig_handler se llama becaues de sigchld y luego el 2nd waitpid como se muestra arriba en mi pregunta devuelve -1. Entonces, ¿puedo eliminar el 2do waitpid que estoy teniendo? – Vin
Sí, solo puede esperar satisfactoriamente un proceso hijo determinado una vez. En realidad, es un error esperar nuevamente ya que el pid es "liberado" en la primera espera y puede haber sido reutilizado para un nuevo proceso secundario (si es que ha creado otro). –
@R .. ¿Podríamos aclarar el 'Cuando el proceso secundario termina, su extremo de la tubería se cerrará? Un poco? Para ser realmente preciso, ¿no sería 'Cuando el proceso secundario cierra su FD que está conectado al extremo de la tubería, y no hay otros procesos que tengan FD conectados a ese extremo de la tubería, entonces el otro extremo de la tubería será señalado como cerrado (recibe EOF) '? Creo que eso explicaría con mayor precisión lo que sucede, y también el caso especial importante de lo que sucede si se abren más de 2 procesos con FDs en una tubería. – nh2