Análisis del mecanismo de señal de Linux

  

En Linux, la señal también se denomina interrupción suave. El proceso procesa la señal después de recibir la señal, lo que se puede decir que es un proceso de interrupción. Este artículo le dará una breve explicación del mecanismo de señalización de Linux.

1, la función de procesamiento de señal se instala

en el nivel de la programación del sistema más directamente relacionada con la relación entre las señales de proceso y tiene dos funciones, que se utilizan para instalar la función de procesamiento de señal: < Br>

señal sighandler_t (int signum, sighandler_t handler);

int sigaction (int signum, const struct sigaction * act ,, struct sigaction * oldact);

primera función La señal es relativamente simple, sighandler_t es un alias, su prototipo es typedef void (* sighandler_t) (int), que es un puntero a función, acepta un parámetro de tipo int (número de señal), devuelve void. Por ejemplo, para procesar la señal SIGUSR1:

void handler (int sig)
<<> <

//La función strsiganl es convertir el número de la señal a la cadena de la descripción de la señal < Br>

printf (" Rcv una señal:% s ", strsignal (sig));

}

int main ()

{
señal

(SIGUSR1, controlador);

while (1)

;

}

(Este programa es realmente problemático, Como veré más adelante, este programa es originalmente un bucle infinito, pero enviándole una señal SIGUSR1, el programa pasará del tiempo en la "interrupción" para ejecutar el código en el controlador. En el shell, use el comando kill para enviar la señal SIGUSR1. El programa luego promete una información como esta: Rcv una señal: Señal definida por el usuario 1. El uso de la señal () es casi tan simple como eso. Sin embargo, por razones de portabilidad, la siguiente función debe usarse al participar en el desarrollo del proyecto.

Hay dos estructuras en los parámetros de la función sigaction (). El prototipo de la página de manual es el siguiente:

struct sigaction {

void (* sa_handler) (int); Br>

void (* sa_sigaction) (int, siginfo_t *, void *);

sigset_t sa_mask;

int sa_flags;

void (* sa_restorer) ( Void);

};

Por lo que sé, sa_handler y sa_sigaction están en realidad en una unión, son indicadores para señalar a los manejadores.

sa_mask es la señal a enmascarar, y sa_flags tiene varias opciones.
(Más sobre estos dos puntos más adelante). Desde el prototipo sigaction (), podemos encontrar que hay dos parámetros struct sigaction en el parámetro, donde act es el procesamiento de la señal que se va a instalar, y oldact se usa para recuperar el método de procesamiento original para que podamos recuperarlo después del procesamiento de la señal. Si no necesita recuperar el método de procesamiento de señal anterior, puede establecer el tercer parámetro en NULL. Si solo desea obtener el método de procesamiento anterior en lugar de instalar un nuevo procesamiento de señal, puede establecer el segundo parámetro en NULL. La señal () no está disponible. Reescribir el ejemplo anterior con sigaction () es así:

1 void handler (int sig)

2 {

3 printf (" Rcv a signal:% s ", strsignal (sig));

4}

5

6 int main ()

7 {

8 struct Sigaction act;

9 sigemptyset (&act.sa_mask);

10 act.sa_handler = handler;

11 act.sa_flags = 0;

12 sigaction (SIGUSR1, &act, NULL);

13 while (1)

14;

15} Anterior12Siguiente Total 2 Páginas

Copyright © Conocimiento de Windows All Rights Reserved