"APUE": Procesamiento de señal

  

Descripción del programa: en un entorno Unix, podemos dejar que el programa enmascare algunas señales (excepto la señal SIGKILL y SIGSTOP). Este ejemplo demuestra esta función.

//Programa "APUE" 10-11: Ejemplos de procesamiento de señales y sigprocmask # include < unistd.h > # include < stdio.h > # include < stdlib.h > # include < señal .h > //salida un mensaje de error y salidas error_quit void (const char * str) {fprintf (stderr, "% s \\ n ", str); de salida (1);} //señal de vacío sig_quit SIGQUIT controlador ( int signo) {printf (" atrapado SIGQUIT \\ n "), si (SIG_ERR == señal (SIGQUIT, SIG_DFL)) error_quit (" no se puede restablecer SIGQUIT ");} int main (void) {sigset_t newmask, oldmask , pendmask; //manejador conjunto si la señal SIGQUIT (SIG_ERR == señal (SIGQUIT, sig_quit)) error_quit (" no puede coger SIGQUIT "); //el conjunto de señales newmask se inicializa a sigemptyset vacío (&newmask ); //En el conjunto de señales de nueva máscara, agregue la señal SIGQUIT sigaddset (&newmask, SIGQUIT); int temp; //Establezca la máscara antigua al conjunto de señales enmascarado actual (para su posterior recuperación) //Agregue la nueva máscara a la señal de la máscara actual Establecer temp = sigprocmask (SIG_BLOCK, &newmask, &oldmask); if (temp < 0) error_quit (" error SIG_BLOCK "); sueño (5); //devuelve el conjunto señal de máscara actual temp = sigpending (&pendmask), si (temp < 0) error_quit (" error " sigpending;); //comprobar señal SIGQUIT está en pendmask señal centralizada si (sigismember (&pendmask, SIGQUIT)) printf (" \\ \\ nSIGQUIT pendiente n "); //restaurar el conjunto temp señal máscara = sigprocmask (SIG_SETMASK, &oldmask, NULL); si (temp < 0) error_quit (" error SIG_SETMASK "); printf (" SIGQUIT desbloqueado \\ n "); sueño (5); return 0;} ejecutar ejemplo:

www. linuxidc.com @ubuntu: ~ /código $ gcc -o temp.c temp www.linuxidc.com @ubuntu: ~ /$ código se genera ./temp ^ \\ # señal una vez SIGQUIT SIGQUIT pendientes # atrapado SIGQUIT # devuelve del sueño SIGQUIT desbloqueado en el programa de procesamiento de señales # sigpromask devuelve ^ \\ quit # nuevamente genera la señal www.linuxidc.com @ubuntu: ~ /code $ ./temp # Vuelva a ejecutar el programa ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ ^ \\ \\ Generar varias veces SIGQUIT señal SIGQUIT pendiente capturada SIGQUIT # solo recibe una señal SIGQUIT desbloqueada ^ \\ Salir

Conclusión:

1: El proceso bloquea la señal SIGQUIT, durante la cual la señal SIGQUIT generada se bloquea hasta que la señal deja de estar bloqueada.

2: Durante el reposo, si se genera una señal, la señal en este momento está pendiente, pero ya no está bloqueada (por lo que se puede llamar a la función sig_quit antes de salir)

3: El sistema no pone en cola la señal mientras la señal está bloqueada.

Notas (este pasaje está extraído de Internet):

Señal '; Pendiente " es un estado que se refiere a la generación de señales antes de que se procese la señal. Este período de tiempo; la señal "" bloqueo" es una acción de conmutación, lo que significa que la señal de bloqueo se procesa, pero no para evitar que se genere la señal.

El ejemplo de APUE utiliza sigprocmask para bloquear la señal de salida antes de dormir, luego dormir, y luego genera una señal de salida durante el proceso de suspensión, pero la señal de salida está bloqueada en este momento (chino " bloqueando " Es fácil ser mal entendido como un estado aquí, de hecho es un tipo de acción similar a un interruptor, por lo que se dice que "bloqueado" está bloqueado, en lugar de "bloqueado", por lo que está en el estado de "pendiente" Después de la suspensión, use sigprocmask para desactivar el interruptor de bloqueo de la señal de salida, ya que la señal de salida generada antes está siempre en estado pendiente. Cuando el interruptor de bloqueo está cerrado, sale inmediatamente del estado "Pendiente" y se procesa. Esto sucede en sigprocmask. Antes de

Copyright © Conocimiento de Windows All Rights Reserved