Conferencia sobre conocimiento de Linux: señal y bloqueo de Linux

  
                  


1. Máscara de señal - Conjunto de señales bloqueadas


Cada proceso tiene un conjunto de señales que describe qué señales se deben bloquear, si es que algunas Cuando la señal está en el conjunto de señales de bloqueo de un proceso, la señal transmitida al proceso se bloqueará. El conjunto de señales actualmente bloqueadas por el proceso también se denomina máscara de señal, de tipo sigset_t. Cada proceso tiene su propia máscara de señal, y cuando se crea un proceso secundario, el proceso secundario hereda la máscara de señal del proceso principal.


2. Diferencias entre el bloqueo de la señal y la omisión


El concepto de bloqueo es diferente de ignorar las señales: el sistema operativo no pasa señales hasta que el proceso desbloquea la señal. Al salir, la señal bloqueada no afectará el comportamiento del proceso, la señal solo se bloquea temporalmente para que no pase, cuando el proceso ignora una señal, la señal se transmite, pero el proceso descartará la señal.


3. Operación del conjunto de señales


El conjunto de señales se puede operar mediante las siguientes funciones:


int sigemptyset (sigset_t * set) //Borrar el conjunto de señales


int sigfillset (sigset_t * set); //rellene todas las señales en el conjunto


int sigaddset (sigset_t * set, int signum Agregue una señal al conjunto signum


int sigdelset (sigset_t * set, int signum); //Elimine la señal del conjunto signum


int sigismember (const sigset_t * set, int signum); //determina si signnum está incluido en el set, return 1, no return 0. La inicialización de


a menudo puede usar sigemptyset () para borrar el conjunto de señales, y luego Use sigaddset () para agregar una señal al conjunto de señales, o use sigfillset () para agregar todas las señales al conjunto de señales, y luego use sigdelset () para eliminar una señal del mismo.


4. Introducción a sigprocmask ()


Puede usar la función sigprocmask () para verificar o modificar la máscara de señal de un proceso. La información de la función es la siguiente:


#include


int sigprocmask (int how, const sigset_t * restrict set,


sigset_t * restrict old);


El parámetro cómo es un número entero que indica cómo se modifica la máscara de señal:


SIG_BLOCK --- Agrega la señal en el conjunto de señal señalado por ajuste a la señal de bloqueo actual


SIG_UNBLOCK --- Elimina la señal en el conjunto de señales señalado por conjunto del conjunto de señales de bloqueo actual;


SIG_SETMASK --- Especifica el conjunto de señales señalado por conjunto Es la señal de bloqueo actual establecida.


Además, si el conjunto de parámetros es NULL, no es necesario modificar la descripción. Si old es NULL, sigprocmask devolverá la señal establecida antes de la modificación en * old. //Este artículo se transfirió desde la red de aplicaciones de hardware y software de www.45it.com


5.sigaction () Revisión


utilizada en la función sigaction () anterior:


incluye


int sigaction (int signum, const struct sigaction * act,


const struct sigaction * oldact);


Esta función se utiliza para registrar una función de procesamiento de señal. La estructura de parámetros sigaction tiene el mismo nombre que la función. La información específica es la siguiente:


struct sigaction {


void (* sa_handler) (int); //Función de procesamiento de señales de tipo antiguo Pointer


void (* sa_sigaction) (int, siginfo_t *, void *); //Nuevo tipo de puntero de función de procesamiento de señal


sigset_t sa_mask; //será Conjunto de señales bloqueadas


int sa_flags; //Máscara de modo de procesamiento de señal


void (* sa_restorer) (void); //Reserved

}



5.1 sa_handler: un puntero de función que apunta a la dirección del manejador de señales (el antiguo tipo de manejador de señales) cuyo prototipo es void handler (int);


5.2 sa_sigaction: también es un puntero de función que se usa para señalar el prototipo:


void handler (int (nuevo tipo de función de procesamiento de señales);


El significado de los tres parámetros es:


iSignNum: la señal entrante


pSignInfo: cierta información relacionada con la señal, es una estructura


pReservado: Reservado, no usado ahora


5.3 sa_handler y sa_sigaction solo deben tener uno Efectivo, si desea utilizar el antiguo mecanismo de procesamiento de señales, debe dejar que sa_handler apunte a la función de procesamiento de señales correcta; de lo contrario, debería dejar que sa_sigaction apunte a la función de procesamiento de señales correcta y dejar que el campo sa_flags contenga la opción SA_SIGINFO.


5.4 sa_mask es una estructura que contiene un conjunto de señales cuyas señales representan las señales que deben bloquearse cuando se realiza el procesamiento de la señal. El conjunto de señales se puede manipular utilizando las cinco funciones mencionadas en el encabezado anterior 3. >


5.5 El campo sa_flags es un compuesto de un conjunto de máscaras que indican algunos comportamientos que deben tomarse durante el procesamiento de la señal. El significado de cada máscara es:


(1) SA_RESETHAND --- Después de procesar la señal a capturar, el registro de la función de procesamiento de la señal se deshará automáticamente, es decir, la función de procesamiento de la señal se debe volver a registrar para continuar procesando la siguiente señal generada.


(2) SA_NODEFER --- Al procesar otra señal, si se produce otra señal, entrará inmediatamente en el procesamiento de otras señales. Después de procesar otras señales, continúe procesando la señal actual, es decir, procesándola de manera regular. . Si sa_flags contiene la máscara, la sa_mask de la estructura sigaction no será válida;


(3) SA_RESTART --- Si el programa está bloqueando, un programa está bloqueando, como una llamada La función read () regresa del sistema bloqueado después de procesar la señal. Esta máscara se ajusta al flujo de procesamiento normal del programa, por lo que, en general, la máscara se debe configurar, de lo contrario, la llamada al sistema bloqueada devolverá un error después de que se procese la señal;


(4) SA_SIGINFO - - Indica cuál de los punteros del manejador de señales de la estructura es válido. Si sa_flags contiene la máscara, el puntero sa_sigactiion es válido, de lo contrario, el puntero sa_handler es válido.


Se debe tener en cuenta que:


La función sigprocmask es un bloqueo de rango completo. Después de que el conjunto de bloqueo se establece en sigprocmask, la señal de bloqueo ya no puede ser capturada por la función de procesamiento de señal. Hasta que se reinicie el conjunto de señales de bloqueo. Cuando sigaction () registra la función de procesamiento de señales, el conjunto de señales seleccionado solo se bloquea cuando se procesa la señal capturada.

Copyright © Conocimiento de Windows All Rights Reserved