【问题标题】:How to block signals in C?如何在C中阻止信号?
【发布时间】:2012-11-20 20:04:37
【问题描述】:

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

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

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");
  }
}

谁能帮帮我?

【问题讨论】:

    标签: c linux signals block sigprocmask


    【解决方案1】:

    sigpending 不会告诉您信号是否被阻塞。它告诉您信号是否正在等待传递。 (即,信号被阻塞并且已经发送了一个。)

    另外,阻塞并不意味着信号不会被传递;这意味着现在不会传递信号。这样就可以发送信号了,信号一畅通就送;可能在调用sigprocmask(SIGUNBLOCKED...) 之后但在调用printf 之前,所以您可能会在看到“解锁”消息之前看到收到信号的消息。

    【讨论】:

    • 非常感谢。我明白我必须做什么;)我必须在 sigpending 之前使用 kill。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2014-09-10
    • 2011-04-17
    相关资源
    最近更新 更多