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.
Esta lista {SIGSEGV, SIGSUSP} no se envía a sigprocmask (SIG_BLOCK, & x, NULL) entonces ¿por qué se bloquean? x solo contiene sigusr1. – user2975699
@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