C ++中的SIGINT signal()/ sigaction

时间:2011-09-30 13:43:04

标签: c++ signals sigint

所以这是我的代码:

void sigHandle(int sig)
{
    signal(SIGINT, sigHandle);    //Is this line necessairy?
    cout<<"Signal: "<<sig<<endl;    
}

int main(){

    signal(SIGINT, sigHandle);

    while(true){ //Supposed to loop until user exits.

    //rest of my code

    }
}

现在我对signal()的理解是,当接收到SIGINT命令(Ctrl + C对吗?)时,我的函数sigHandle应该用整数值2(SIGINT号)调用,该方法应该运行并且程序应 NOT 退出。

我想做的只是打印信号编号并继续前进,但是在打印出“信号:2”之后它会退出。

(最终我应该处理前32个中断,但我认为Ctrl + C将是最困难的,所以我从这里开始。)

在main中如果我执行信号(SIGINT,SIG_IGN); 它会正确地忽略信号并且不会退出但我现在无法知道我是否收到了SIGINT中断。

早些时候我正在使用sigaction结构,但我找不到任何真正全面的文档,所以我决定只使用“原始”信号处理。

这是我的sigaction代码(与上面相同的问题):

struct sigaction action;
action.sa_handler = sigHandle;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
sigaction(SIGINT, &action, 0);

感谢您的帮助!

修改

OK SO经过手册页和互联网的许多小时后,我发生了一个(非常)贫民窟解决方案,包括保存堆栈前无限循环,然后当中断到来时,做我需要做的事情,然后将堆栈重新设置回原来的位置,并调用sigrelse()命令重新设置可能已更改但未重新加载的任何状态。

据我所知,这不是解决这个问题的最优雅/最有效/甚至是社会可接受的解决方案,但它可行,据我所知,我不会在任何地方泄露任何内存,所以这一切都很好......

我仍在寻找这个问题的解决方案,我认为我的堆栈重新设置shenanigins只是一个临时修复......

谢谢!

2 个答案:

答案 0 :(得分:0)

不是。您只需使用相同的功能替换SIGINT的句柄。你如何编程执行等待?

如果你有类似的话:

int main
{ 
 // ...

  int r = read(fd, &buff, read_size); // your program hangs here, waiting for the data.
                                      // but if signal occurred during this period of time
                                      // read will return immediately, and r may != read_size

  return 0;  // then it will go straight to return.
}

答案 1 :(得分:0)

另请注意,不应在信号处理程序中调用stdio(或其他非重入函数)。 (您的信号处理程序可能在malloc中间调用,或者它与C ++等效)