¿Cómo puedo manejar SIGCHLD?

Necesito manejar SIGCHLD correctamente. ¿Cómo puedo usarlo con mi código actual? en este momento no puedo esperar al proceso secundario a menos que use 0 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 el sleep , 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 no tiene sentido . Si el padre simplemente ignora SIGCHLD , los niños son recogidos silenciosamente 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 posteriormente finalice se elimine inmediatamente del sistema en lugar de convertirse en un zombie .

Entonces algo como esto debería hacer el truco para ti:

 signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */