En un sistema que ejecuta Linux 2.6.35+, mi programa crea muchos procesos secundarios y los supervisa. Si un proceso secundario muere, hago algunas tareas de limpieza y vuelvo a generar el proceso. Yo uso signalfd()
para obtener la señal SIGCHLD
en mi proceso. signalfd
se usa de forma asincrónica usando libevent
.Manejo de SIGCHLD múltiple
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 debe bloquearse 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 al usar signalfd()
también? Dado que el manejo basado en signalfd
no tiene los problemas típicos asociados con la ejecución asincrónica de los manejadores de señal normales, estaba pensando en kernel queue todas las ocurrencias adicionales de SIGCHLD
?
¿Alguien puede aclarar el comportamiento de Linux en este caso ...
Gracias .. par de preguntas ..
Digamos que hay muchos eventos en la cola de epoll que mi proceso aún no agota. En ese caso, ¿está usted diciendo que kernel pondrá en cola solo un evento de lectura para SIGCHLD en la señal transmitida incluso si mueren n procesos? Sobre usar el waitpid() en un bucle, el problema que tengo con este enfoque es que solo obtiene el estado de salida del proceso hijo, pero pierde otra información que obtendría de struct signalfd_siginfo cuando lee desde signalfd (o siginfo_t cuando usa sigaction). ¿Supongo que no hay forma de obtener eso? – Manohar
@Santhosh, tenga en cuenta que epoll no pone en cola los eventos del descriptor de archivos en el sentido literal; más bien, solo informa el estado de los descriptores de archivos (legibilidad, capacidad de escritura). Entonces, cuando ocurren eventos en un descriptor de archivo que lo hace legible, no importa cuántos hay, epoll solo informará la legibilidad.Y la próxima vez que haga un epoll_wait(), hará exactamente lo mismo (excepto si usa epoll activado por flanco, pero aún así no informará el número de eventos). Sobre la estructura signalfd_siginfo, creo que tienes razón. Pero, ¿qué necesitarías de allí en caso de SIGCHLD de todos modos? –
@Santhosh: también tenga en cuenta que signalfd() comprime las señales SIGCHLD, no epoll. Esto significa que no solo no obtendrá múltiples eventos de epoll, sino que obtendrá una sola señal SIGCHLD de read(); la estructura signalfd_siginfo de los otros se perderá para siempre. –