Set y Oldset en sigprocmask()


No he entendido completamente cómo usar sigprocmask(). En particular, cómo funcionan set y oldset y su sintaxis y cómo usarlos.

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

Por favor, explique con un ejemplo, para bloquear, diga SIGUSR1 durante unos segundos y luego desbloquearlo y manejarlo. ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Author: ɢʀᴜɴᴛ, 2008-08-24

1 answers

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 cambia las señales que no se establecen en la lista. SIG_SETMASK bloquea las señales en la lista, y desbloquea los que no están en la lista.

Por ejemplo, supongamos que la antigua lista de bloqueo era {SIGSEGV, SIGSUSP} y usted 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 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 se establecerá ahora en {SIGUSR1}.

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

sigset_t y;

Y llamamos el código en los ejemplos anteriores como este:

    sigprocmask(SIG_BLOCK, &x, &y)

Ahora tenemos:

y == {SIGSEGV, SIGSUSP}

Si ahora lo hacemos:{[26]]}

    sigprocmask(SIG_UNBLOCK, &x, &y)

Obtendremos {[26]]}

y == {SIGSEGV, SIGSUSP, SIGUSR1}

Y si lo hacemos:{[26]]}

    sigprocmask(SIG_SET, &x, &y)

Obtendremos esto: {[26]]}

y == {SIGSEGV, SIGSUSP}

Porque este es el valor anterior del conjunto de bloqueo.

 63
Author: Nathan Fellman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 13:17:50