GNU/Linux >> Tutoriales Linux >  >> Linux

Manejo de señales UNIX/Linux:SIGEV_THREAD

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. Los sigev_signo campo especifica la señal, el sigev_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. El sigev_notify_function campo especifica la función que se llama, sigev_value contiene datos complementarios que se pasan a la función, y sigev_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).


Linux
  1. Linux vs Unix:¿Cuál es la diferencia?

  2. Migración de Unix a Linux

  3. Linux:¿Linux es un Unix?

  4. Principales diferencias entre el kernel de Linux y UNIX

  5. ¿Linux es un Unix?

Comando mkdir en Linux/Unix

Linux frente a Unix

Comando Grep en Linux/UNIX

Comando ls en Linux/UNIX

comando cp en Linux/UNIX

Buscar comando en Linux/UNIX