Por que sigset inclui o SIGINT não adaptado? [fechadas]

0

Escrevi um programa simples para aprender a escrever o tratamento de sinal no estilo POSIX.

#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

static void sig_int(int);

int
main(void)
{
    sigset_t    waitmask;

    if (signal(SIGINT, sig_int) == SIG_ERR) {
        printf("error occured\n");
        exit(1);
    }
    sigemptyset(&waitmask);
    sigaddset(&waitmask, SIGUSR1);
    if (sigsuspend(&waitmask) != -1) {
        printf("error\n");
        exit(1);
    }
}

static void
sig_int(int signo)
{
    sigset_t sigset;
    sigprocmask(0, NULL, &sigset);
    if (sigismember(&sigset, SIGINT))
        printf("SIGINT\n");
    if (sigismember(&sigset, SIGUSR1))
        printf("SIGUSR1\n");
}
  1. Eu crio um conjunto de sinais vazio.

  2. Então eu adiciono o SIGUSR ao sigset.

  3. Instale o manipulador de sinal

  4. Quando eu lanço o programa e ele faz uma pausa esperando pelo sinal, eu gero o SIGINT, o handler imprime que o SIGINT também é membro do sigset, isso parece ser um comportamento muito estranho.

Por que sigismember acha que SIGINT é membro de sigset, embora não tenha sido adicionado explicitamente com sigaddset (& amp; waitmask, SIGINT) ?

    
por Bulat M. 06.01.2017 / 18:54

1 resposta

2

Em man 2 signal :

If  the  disposition  is  set  to  a function, then first either the
disposition is reset to SIG_DFL,  or  the  signal  is  blocked  (see
Portability below), and then handler is called with argument signum.
If invocation of the handler caused the signal to be  blocked,  then
the signal is unblocked upon return from the handler.
    
por muru 06.01.2017 / 19:10