Establecer y Oldset en sigprocmask()
posix signals (1)
No he entendido completamente, cómo usar sigprocmask()
. Particularmente, 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, para bloquear, diga SIGUSR1 durante unos segundos y luego desactívelo y manipúlelo.
La idea es que proporciones una máscara en el set
, efectivamente una lista de señales. El argumento de how
dice qué debe hacer con la máscara en el 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 antigua lista de bloqueo 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 llamas a sigprocmask
con estos argumentos ahora:
sigprocmask(SIG_UNBLOCK, &x, NULL)
La nueva lista de bloqueo volverá a ser {SIGSEGV, SIGSUSP}
.
Si llamas a sigprocmask
con estos argumentos ahora:
sigprocmask(SIG_SETMASK, &x, NULL)
La nueva lista de bloqueo ahora se establecerá en {SIGUSR1}
.
El argumento oldset
te dice cuál era 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)
Nosotros recibiremos
y == {SIGSEGV, SIGSUSP, SIGUSR1}
y si lo hacemos:
sigprocmask(SIG_SET, &x, &y)
conseguiremos esto:
y == {SIGSEGV, SIGSUSP}
porque este es el valor anterior del conjunto de bloqueo.