SIGINT signal()/ sigaction in C ++

问题描述 投票:2回答:2

所以这是我的代码:

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对吗?)时,应使用2的整数值(SIGINT号)调用函数sigHandle。 ,该方法应该运行,并且程序应NOT退出。

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

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

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

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

这是我的签名代码(与上面相同的问题:

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

感谢您的帮助!

编辑

好吧,在花了很多小时浏览手册页和互联网之后,我遇到了一个(非常)贫民窟的解决方案,涉及保存堆栈预无限循环,然后在中断到来时做我需要做的事,然后重新-将堆栈设置回原来的位置,并调用sigrelse()命令以重新设置可能已更改但尚未重新加载的所有状态。

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

我仍在寻找解决此问题的方法,我将我的堆栈重新设置shenanigins只是一个临时解决方案...

谢谢!

c++ signals sigint
2个回答
0
投票

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


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.
}
© www.soinside.com 2019 - 2024. All rights reserved.