2008-08-24 8 views
21

No he entendido completamente, cómo usar sigprocmask(). Particularmente, cómo funcionan el set y el oldset y su sintaxis y cómo usarlos.Set y Oldset en sigprocmask()

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

favor explicar con un ejemplo, para bloquear, por ejemplo SIGUSR1 durante unos segundos y luego desbloquear y manejarlo.

Respuesta

61

La idea es que proporcione una máscara en set, efectivamente una lista de señales. El argumento how dice lo que debe hacer con la máscara en set.

Puede usar SIG_BLOCK para bloquear las señales en la lista set, o SIG_UNBLOCK para desbloquearlas. Ninguno de estos cambios las señales que no están establecidas en la lista. SIG_SETMASK bloquea las señales en la lista y desbloquea las que no están establecidas en la lista.

Por ejemplo, supongamos que la lista de bloqueo de edad fue {SIGSEGV, SIGSUSP} y llama sigprocmask con estos argumentos:

sigset_t x; 
sigemptyset (&x); 
sigaddset(&x, SIGUSR1); 
sigprocmask(SIG_BLOCK, &x, NULL) 

La nueva lista de bloqueo será ahora {SIGSEGV, SIGSUSP, SIGUSR1}.

Si llama sigprocmask con estos argumentos ahora:

sigprocmask(SIG_UNBLOCK, &x, NULL) 

La nueva lista de bloqueo volverá a ser {SIGSEGV, SIGSUSP}.

Si llama sigprocmask con estos argumentos ahora:

sigprocmask(SIG_SETMASK, &x, NULL) 

La nueva lista de bloqueo se definirá a {SIGUSR1}.

El argumento oldset le indica cuál era la lista de bloqueo anterior. Si tenemos esta declaración:

sigset_t y; 

y que llamamos el código en los ejemplos anteriores así:

sigprocmask(SIG_BLOCK, &x, &y) 

ahora tenemos:

y == {SIGSEGV, SIGSUSP} 

Si ahora hacemos:

sigprocmask(SIG_UNBLOCK, &x, &y) 

obtendremos

y == {SIGSEGV, SIGSUSP, SIGUSR1} 

y si lo hacemos:

sigprocmask(SIG_SET, &x, &y) 

nos pondremos esto:

y == {SIGSEGV, SIGSUSP} 

porque este es el valor previo del conjunto de bloqueo.

+0

Esta lista {SIGSEGV, SIGSUSP} no se envía a sigprocmask (SIG_BLOCK, & x, NULL) entonces ¿por qué se bloquean? x solo contiene sigusr1. – user2975699

+3

@Nathan - Tu explicación es brillante: siete años seguidos siendo tan sólido como el rock para ayudar a las personas a entender sigprocmack :) – oneday

Cuestiones relacionadas