如何阻止C中的信号?

我正在尝试创建一个阻止信号SIGUSR1的程序,它会解锁信号。 在中间,我想看到使用sigpending阻止信号。 但它总是说信号没有被阻挡,我可以在信号被阻挡时使用它。 这是我的代码。

 #include  #include  #include  static void signals(int signaln) { switch (signaln) { case SIGUSR1: printf("Signal SIGUSR1\n"); break; } return; } main() { sigset_t set,set2; struct sigaction sigs; sigs.sa_handler = signals; sigemptyset(&sigs.sa_mask); sigs.sa_flags=SA_ONESHOT; sigaction(SIGUSR1, &sigs,0); sigemptyset(&set); sigemptyset(&set2); sigaddset(&set,SIGUSR1); if(sigprocmask(SIG_BLOCK, &set, NULL)==0){ printf("Blocking SISGUSR1...\n"); } sigpending(&set2); if (sigismember(&set2,SIGUSR1)==1) { printf("The signal is blocked\n"); //it should print this } wait(2); kill(getpid(),SIGUSR1); //the signal shouldn't work wait(2); if(sigprocmask(SIG_UNBLOCK, &set, NULL)==0){ printf("Unblocking SIGUSR1\n"); } } 

谁能帮助我?

sigpending不会告诉您信号是否被阻止。 它告诉您信号是否等待传递。 (即信号被阻止一个信号被发送。)

此外,阻止不会导致信号无法传递; 这意味着现在不会传递信号。 因此,您可以发送信号,并在信号解除阻塞后立即发送; 可能在调用sigprocmask(SIGUNBLOCKED...)但在调用printf之前,所以在看到“解锁”消息之前,您可能会看到收到信号的消息。