Set y Oldset en sigprocmask ()
-
09-06-2019 - |
Pregunta
No he entendido completamente, cómo usar sigprocmask ()
. En particular, cómo funcionan el set
y oldset
y su sintaxis y cómo usarlos.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Explique con un ejemplo, bloquear, diga SIGUSR1 durante unos segundos y luego desbloquearlo y manejarlo.
Solución
La idea es que proporcione una máscara en set
, efectivamente una lista de señales. El argumento how
dice lo que debes hacer con la máscara en set
.
Puede usar SIG_BLOCK
para bloquear las señales en la lista de set
, o SIG_UNBLOCK
para desbloquearlas. Ninguno de estos cambios cambia 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, suponga que la lista de bloqueo anterior era {SIGSEGV, SIGSUSP}
y llama a sigprocmask
con estos argumentos:
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
La nueva lista de bloqueo ahora será {SIGSEGV, SIGSUSP, SIGUSR1}
.
Si llama a sigprocmask
con estos argumentos ahora:
sigprocmask(SIG_UNBLOCK, &x, NULL)
La nueva lista de bloqueo volverá a ser {SIGSEGV, SIGSUSP}
.
Si llama a sigprocmask
con estos argumentos ahora:
sigprocmask(SIG_SETMASK, &x, NULL)
La nueva lista de bloqueo ahora se establecerá en {SIGUSR1}
.
El argumento oldset
le dice cuál fue la lista de bloqueo anterior. Si tenemos esta declaración:
sigset_t y;
y llamamos al código en los ejemplos anteriores como este:
sigprocmask(SIG_BLOCK, &x, &y)
ahora tenemos:
y == {SIGSEGV, SIGSUSP}
Si ahora lo hacemos:
sigprocmask(SIG_UNBLOCK, &x, &y)
obtendremos
y == {SIGSEGV, SIGSUSP, SIGUSR1}
y si lo hacemos:
sigprocmask(SIG_SET, &x, &y)
obtendremos esto:
<*>porque este es el valor anterior del conjunto de bloqueo.