libevent y manejo de señales (SIGCHLD específicamente)

Esto es algo así como un seguimiento de la pregunta relacionada que encontré aquí.

En la pregunta vinculada hay una mención de usar signalfd() y usando ese fd con liberador. En esa pregunta, el OP no enumera por qué está usando signalfd() a diferencia de las instalaciones de manejo de señales de libevent.

En ambos métodos, estaría procesando la devolución de llamada fuera del controlador de señal.

Esta documentación parece advertir sobre la programación del temporizador en la devolución de llamada del evento de señal. Lo cual no parece correcto (ya que estaríamos fuera de un contexto de controlador de señal). Aparte de dicha advertencia, no veo ningún beneficio en hacer esto con signalfd().

Cualquier entrada sobre la diferencia entre los dos métodos o sobre la advertencia

¡Gracias!

preguntado el 03 de mayo de 12 a las 16:05

El beneficio de usar signalfd() es que puede leer la estructura signalfd_siginfo y obtener mucha información útil sobre la señal. -

La desventaja es que si varios hijos salen antes de que puedas leer de la señal, se comprimirán en uno solo. Entonces la información de los otros niños se perderá. Todavía puede obtener algunos bits de información con las macros WIFEXITED y cosas así... -

1 Respuestas

del código fuente de libevent (v2.0.19-estable)

/* señal.c

Esta es la implementación de manejo de señales que usamos para backends que no tienen una mejor manera de manejar señales. Utiliza sigaction() o signal() para configurar un controlador de señal y un par de sockets para indicarle a la base de eventos cuándo

Tenga en cuenta que dije "la base de eventos": solo se puede configurar una base de eventos para usar esto a la vez. Por razones históricas y compatibilidad con versiones anteriores, si agrega un evento para una señal a event_base A, luego agrega un evento para una señal (¡cualquier señal!) a event_base B, event_base B recibirá información sobre la señal, pero event_base A no .

Sería bueno cambiar este comportamiento en alguna versión futura de Libevent. kqueue ya hace algo mucho más sensato. Podemos hacer que todos los backends en Linux hagan algo razonable usando signalfd. */

así que en este momento libevent usa sigaction() si está disponible y, en su defecto, signal().

si usa signalfd(), generalmente bloquea la señal usando sigprocmask para que las señales no hagan que se ejecuten los controladores predeterminados. luego, puede monitorear el identificador del archivo devuelto usando libevent y manejar la señal del código síncrono normal de manera segura, sin tener que preocuparse por la seguridad de la memoria o bloquear o interrumpir otras llamadas al sistema.

existen restricciones sobre lo que puede hacer de manera segura dentro de los controladores de señales asíncronos clásicos (es decir, aquellos registrados usando sigaction). Consulte las "Funciones seguras de señal asíncrona" en la señal man. Usando el enfoque de Signalfd, estas restricciones se reducen considerablemente.

la advertencia sobre el registro de una devolución de llamada del temporizador probablemente se colocó allí como una preocupación porque libevent es compatible con muchas plataformas y al menos una persona informó problemas. tenga en cuenta que si está seleccionando/sondeando un identificador de archivo registrado por signalfd, entonces no tiene que preocuparse por esta restricción de todos modos.

EDITAR: volví a leer su pregunta y me di cuenta de que realmente no la había respondido correctamente. el beneficio de registrar una señal y luego usarla en libevent es que es más rápido a expensas de la portabilidad. había planes (http://archives.seul.org/libevent/users/Mar-2010/msg00046.html) para incluir signalfd en libevent pero AFAIK aún no ha sucedido.

Además, una vez que haya recibido la notificación de SIGCHLD, siempre debe llamar a waitpid en un bucle hasta que obtenga ENOCCHLD porque ambos métodos colapsarán múltiples ocurrencias de la señal.

contestado el 09 de mayo de 12 a las 09:05

Completamente de acuerdo/entiendo sobre el colapso/waitpid Bucle, y la base de un solo evento puede recibir eventos de señal y, por lo tanto, el beneficio de signalfd. Pero sigo pensando que si hay plataformas, entornos donde los eventos de señal no pueden ejecutarse en el bucle del despachador y/u otros eventos no pueden programarse/agregarse, los eventos de señal deben deshabilitarse en esas plataformas (¿puedes decir que no me gustó la advertencia? ? :) ). ¡Gracias! - nhed

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.