gpt4 book ai didi

c++ - 即使程序刚刚启动,是否也可以始终捕获信号?

转载 作者:行者123 更新时间:2023-11-28 06:18:29 25 4
gpt4 key购买 nike

我想捕获发送到我的程序的信号并执行简单的操作(例如,使用指定代码退出)。但是,如果进程在我的信号处理程序设置之前收到信号,它就会异常退出,就像不存在处理程序一样。

我的简单程序的源代码:

#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void handler(int sig) { exit(0); }

int main()
{
signal(SIGTERM, handler);
while(1) { sleep(1); }
return 0;
}

使用g++ my.c 命令编译。

连续运行程序的脚本:

while true; do ./a.out; echo $?; done

如果我手动发送信号进行处理,那么大部分时间一切正常 - 以零代码退出。但是如果我使用下面的脚本:

频繁发送信号给进程的脚本:

while true; do slay -sSIGTERM a.out; done

我收到了很多 Terminated 143 消息。

但是,如果我使用 gcc(而不是 g++),我无法获得非零退出代码的情况。

在这方面,问题是如何让 C++(g++ 编译)程序与 C(gcc 编译)程序具有相似的行为?

最好采用最大标准化方法。

在 QNX 6.5、gcc 4.7.2 上测试

最佳答案

实现您想要的唯一方法是让父进程在 fork 之前阻塞所有信号 (sigprocmask) 并等待在设置信号处理程序之后解除阻塞。任何纯粹在您自己的程序中的东西都是无用的,因为信号仍然可以到达父进程派生的窗口和它执行的窗口之间。

关于c++ - 即使程序刚刚启动,是否也可以始终捕获信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com