c++ - C++ 中的 SIGINT 信号 ()/sigaction

标签 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退出。

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

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

在 main 中,如果我执行 signal(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);

感谢您的帮助!

编辑

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

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

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

谢谢!

最佳答案

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

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

相关文章:

c++ - 使用 Cython 和 distutilis 方法从 Python 调用 C++ 代码

c++ - 为什么起源进程在 Qt-app 中以僵尸启动。 Linux

c++ - Coursera 自动评分器给我未知信号 11

c++ - 仅在我的 2d 引擎中集成 Box2D 碰撞检测?

c++ - 在 Windows 上处理用户 session 的关闭状态?

c++ - 如何用 pthread 捕获堆栈溢出?

c - 在 system() 内部正确处理信号

c - 一项剥夺子孙的计划

从其他函数安装时,C 信号处理程序不会卸载

c++ - 如何捕捉 ctrl-c 事件?