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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top