c posix signals sigprocmask

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.