necesito manejar SIGCHLD
adecuadamente. ¿Cómo puedo usarlo con mi código existente? por el momento no puedo esperar al proceso hijo a menos que use 0
en lugar de WNOHANG|WUNTRACED
.
status = 0;
pid_t child, endID;
if(amp == 1)
signal( SIGCHLD, SIG_IGN );
child = fork();
if (child < 0) {
perror("fork() error\n");
exit(EXIT_FAILURE);
} else if (child == 0) {
// do sth here
perror("error\n");
} else {
//sleep(1)
si elimino sleep
entonces el padre se ejecuta primero … ¿por qué?
Aquí hay un comienzo (pero lea a continuación):
static void
child_handler(int sig)
{
pid_t pid;
int status;
/* EEEEXTEERMINAAATE! */
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
;
}
/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;
sigaction(SIGCHLD, &sa, NULL);
Por supuesto, esto es todo inútil. Si el padre simplemente ignora SIGCHLD
los niños son cosechados en silencio y no se convertirán en zombis.
citando TLPI:
Establecer explícitamente la disposición de SIGCHLD en SIG_IGN hace que cualquier proceso secundario que finalice posteriormente se elimine inmediatamente del sistema en lugar de convertirse en un zombi.
Así que algo como esto debería hacer el truco para ti:
signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */
Qué estás intentando lograr ?
– cnicutar
24 de agosto de 2011 a las 7:13
Permita la combinación de procesos de fondo y primer plano escribiendo e instalando una función de controlador de señal adecuada
– Kanoz
24 de agosto de 2011 a las 7:18
¿Qué debe hacer el controlador de señales?
– cnicutar
24 de agosto de 2011 a las 7:19
mata o ignora zombies
– Kanoz
24 de agosto de 2011 a las 7:20
Esto parece estar relacionado con Ejemplo de
waitpid()
,WNOHANG
ySIGCHLD
.–Jonathan Leffler
24 de agosto de 2011 a las 7:25