2009-12-18 19 views
6

Necesito encontrar el número de señales pendientes en la cola de señales de un hilo en linux. ¿Hay alguna API que sea proporcionada por Linux?cómo determinar el número de señales pendientes en la cola de señales de Unix (Linux)

Esta API debe invocarse desde el hilo, aparte del hilo que estamos consultando.

sigpending proporciona la API para el hilo de llamada. ¿Hay alguna API, que toma la identificación del hilo como arg y proporciona cierta información sobre las señales pendientes en la cola?

Cualquier ayuda es apreciada.

Respuesta

3

No conozco una API así, pero aquí hay una solución: escribir una pequeña biblioteca que envuelva el código de señal. Cuando envíe una señal, aumente un contador atómico. A medida que procesa las señales, disminuya el contador nuevamente. Entonces, puedes usar este contador atómico para responder a tu curiosidad.

[EDITAR] Si eso no es suficiente, entonces tiene la fuente: simplemente examine el código y las estructuras de datos involucradas y use lo que necesita para echar un vistazo a las estructuras del kernel. Pero esto podría implicar escribir un módulo (porque las estructuras de datos del kernel no son legibles por un proceso) además su código dependerá del núcleo en el que se compiló. Así que desaconsejo este enfoque.

+2

Esto es lo que más he visto para encontrar señales de RT pendientes (sin servicio). Otros simplemente se combinan (por tipo) por el núcleo de todos modos, que puede valer la pena señalar. 10,000 SIGUSR1 se entregan como 1. –

6

sigpending() devuelve el conjunto de señales pendientes de entrega para un hilo. Puede iterar sobre ese sigset_t y usar sigismember() para probar la membresía.

Tradicionalmente, UNIX no pone en cola más de una instancia de una señal (en este sentido, siguen siendo "poco confiables"). A veces puedes obtener este efecto con señales en tiempo real.

En Linux, leer() ing desde una señalfd permitirá leer más de una instancia de una señal a la vez, en caso de que estén en cola.