Manejo de múltiples SIGCHLD

En un sistema que ejecuta Linux 2.6.35+, mi progtwig crea muchos procesos secundarios y los monitorea. Si un proceso secundario muere, hago algunas tareas de limpieza y vuelvo a generar el proceso. Uso signalfd() para obtener la señal SIGCHLD en mi proceso. signalfd se usa de forma asincrónica usando libevent .

Al usar manejadores de señal para señales en tiempo no real, mientras el manejador de señal se está ejecutando para una señal particular, la ocurrencia adicional de la misma señal tiene que ser bloqueada para evitar entrar en manejadores recursivos. Si llegan varias señales en ese momento, kernel invoca el controlador solo una vez (cuando la señal está desbloqueada).

¿Es el mismo comportamiento cuando se usa signalfd() también? Dado que el manejo basado en la signalfd no tiene los problemas típicos asociados con la ejecución asíncrona de los manejadores de señales normales, ¿estaba pensando que kernel puede poner en cola todas las demás ocurrencias de SIGCHLD ?

¿Alguien puede aclarar el comportamiento de Linux en este caso …

En Linux, varios hijos que terminan antes de leer un SIGCHLD con signalfd() se comprimirán en un SIGCHLD único. Esto significa que cuando lee la señal SIGCHLD , debe limpiar después de todos los niños que han terminado:

 // Do this after you've read() a SIGCHLD from the signalfd file descriptor: while (1) { int status; pid_t pid = waitpid(-1, &status, WNOHANG); if (pid <= 0) { break; } // something happened with child 'pid', do something about it... // Details are in 'status', see waitpid() manpage } 

Debo señalar que, de hecho, he visto esta compresión de señal cuando dos hijos procesados ​​terminaron al mismo tiempo. Si solo hice un solo waitpid() , uno de los hijos que terminó no fue manejado; y el ciclo anterior lo arregló.

Documentación correspondiente:

En realidad, la manera libre de problemas sería el waitfd funcionalmente que le permitiría agregar un pid específico a poll () / epoll (). Desafortunadamente, no fue aceptado en Linux hace años cuando se propuso.