Definir e Oldset em sigprocmask()
-
09-06-2019 - |
Pergunta
Eu não entendi completamente como usar sigprocmask()
.Particularmente, como o set
e oldset
e seu funcionamento de sintaxe e como usá-los.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Por favor, explique com um exemplo, para bloquear, diga SIGUSR1 por alguns segundos e depois desbloqueie e manipule.
Solução
A ideia é que você forneça uma máscara em set
, efetivamente uma lista de sinais.O how
argumento diz o que você deve fazer com a máscara em set
.
Você pode usar SIG_BLOCK
para bloquear os sinais no set
lista, ou SIG_UNBLOCK
para desbloqueá-los.Nada disso altera os sinais que não estão definidos na lista. SIG_SETMASK
bloqueia os sinais da lista e desbloqueia aqueles que não estão definidos na lista.
Por exemplo, suponha que a antiga lista de bloqueio fosse {SIGSEGV, SIGSUSP}
e você liga sigprocmask
com estes argumentos:
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
A nova lista de bloqueio será agora {SIGSEGV, SIGSUSP, SIGUSR1}
.
Se você ligar sigprocmask
com estes argumentos agora:
sigprocmask(SIG_UNBLOCK, &x, NULL)
A nova lista de bloqueio voltará a ser {SIGSEGV, SIGSUSP}
.
Se você ligar sigprocmask
com estes argumentos agora:
sigprocmask(SIG_SETMASK, &x, NULL)
A nova lista de bloqueio agora será definida como {SIGUSR1}
.
O oldset
argumento informa qual era a lista de bloqueio anterior.Se tivermos esta declaração:
sigset_t y;
e chamamos o código nos exemplos anteriores assim:
sigprocmask(SIG_BLOCK, &x, &y)
agora temos:
y == {SIGSEGV, SIGSUSP}
Se fizermos agora:
sigprocmask(SIG_UNBLOCK, &x, &y)
nós conseguiremos
y == {SIGSEGV, SIGSUSP, SIGUSR1}
e se fizermos:
sigprocmask(SIG_SET, &x, &y)
vamos conseguir isso:
y == {SIGSEGV, SIGSUSP}
porque este é o valor anterior do conjunto de bloqueio.