【问题标题】:C: Trying to restore signal handlers with sigaction but not succeeding.C:尝试使用 sigaction 恢复信号处理程序但未成功。
【发布时间】:2015-05-11 21:32:25
【问题描述】:

我正在用 C 语言编写一个小程序(在 ubuntu 上运行)。程序第一次收到Ctrl+C,我希望信号被忽略,但是第二次(等待10秒后),我希望恢复原来的动作(并且信号不被忽略)。所以我有这样的事情:

void (*sold)(int);
struct sigaction s;
sold = s.sa_handler;
s.sa_handler = SIG_IGN;
sigaction(SIGINT,&s,NULL);
sleep(10)
s.sa_handler = sold; //(this could be replaced by s.sa_handler = *sold and it doenst make a difference)

该程序似乎很好地忽略了 SIGINT,但它不会恢复..,因为它不会恢复旧的处理程序。我做错了什么?

【问题讨论】:

  • 与其把句柄赋值为NULL,不如写个小函数根据自己的情况处理CTRL-C?

标签: c linux ubuntu operating-system


【解决方案1】:

如果要恢复旧的信号处理程序,则需要实际保存和恢复旧的处理程序:

struct sigaction newHandler;
struct sigaction oldHandler;
memset(&newHandler, 0, sizeof(newHandler));
sigemptyset( &newHandler.sa_mask );
newHandler.sa_handler = SIG_IGN;
sigaction(SIGINT, &newHandler, &oldHandler );
sleep( 10 );
sigaction(SIGINT, &oldHandler, NULL );

【讨论】:

    【解决方案2】:

    如果您想再次更改信号配置,您必须再次调用sigaction()(或另一个用于相同目的的函数)。将新的处理程序分配给您之前设置信号处理程序的struct sigaction 没有特殊效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2021-04-26
      相关资源
      最近更新 更多