struct sigevent
no se trata de especificar cómo el proceso manejará una señal - struct sigaction
y sigaction()
es como lo haces. En su lugar, struct sigevent
se utiliza para especificar cómo se informará a su proceso de algún evento asíncrono, como la finalización de una E/S asíncrona o la expiración de un temporizador.
El sigev_notify
El campo especifica cómo se debe notificar el evento:
SIGEV_NONE
- ninguna notificación en absoluto. El resto de los campos se ignoran.SIGEV_SIGNAL
- se envía una señal al proceso. Lossigev_signo
campo especifica la señal, elsigev_value
El campo contiene datos complementarios que se pasan a la función de manejo de señales y el resto de los campos se ignoran.SIGEV_THREAD
- una función se llama en un nuevo hilo. Elsigev_notify_function
campo especifica la función que se llama,sigev_value
contiene datos complementarios que se pasan a la función, ysigev_notify_attributes
especifica los atributos del subproceso que se utilizarán para la creación del subproceso. El resto de los campos se ignoran.
Tenga en cuenta en particular que si establece SIGEV_THREAD
, el sigev_signo
el campo se ignora - el struct sigevent
se trata de especificar cualquiera un hilo o una señal como método de notificación, no sobre especificar un hilo como la forma en que se debe manejar una señal.
El struct sigevent
también debe pasarse a una función, como timer_create()
- que configura el evento asíncrono que será notificado. Simplemente creando un struct sigevent
objeto no hace nada especial.
Si desea utilizar un subproceso dedicado para manejar una señal, cree el subproceso al principio y haga que se repita, bloqueando en sigwaitinfo()
. Usa sigprocmask()
para bloquear la señal en todos los demás subprocesos.
Creo que estás mezclando tus modismos de manejo de señales aquí, creas un sigevent
estructura y luego no hacer nada con ella y luego usar signal()
dentro del controlador de señales. El siguiente código muestra una rutina de manejo de señales muy simple basada en su código; tenga en cuenta que he cambiado la definición de my_handler
. Si necesita un manejo más sofisticado entonces sigaction()
es probablemente la llamada al sistema que necesita investigar.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
void my_handler(int sig)
{
printf("my_handler caught\n");
signal(sig,my_handler);
}
int main()
{
signal(SIGRTMIN,my_handler);
kill(0,SIGRTMIN); // This should invoke the signal and call the function
while(1) ; // Infinite loop in case the program ends before the signal gets caught!
}
Esto funciona bajo cygwin
en mi caja de Windows (sin acceso a una caja de Linux en este momento).