所以这是我的代码:

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,该方法应运行并且该程序应不是退出。
我只想打印信号编号并继续前进,但是在打印出“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视为临时解决方案。
谢谢!

最佳答案

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

关于c++ - C++中的SIGINT signal()/sigaction,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7611281/

10-13 03:57