C:尝试使用sigaction但不成功恢复信号处理程序。

时间:2015-05-11 21:32:26

标签: c linux ubuntu operating-system

我正在用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,但它没有恢复...,因为它没有恢复旧的处理程序。我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果要再次更改信号处理,则必须再次调用sigaction()(或其他用于相同目的的功能)。将新处理程序分配给先前设置信号处理程序的struct sigaction没有特殊效果。