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.­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top