c++ - 调用 raise(signal) 终止 c++ 程序
问题描述
我有两个程序在我的树莓派上运行。一个与用户交互,另一个侦听消息并在指示时更新消息文件。我希望另一个通知第一个消息已更新,以便第一个可以重新加载消息文件。我虽然 SIGUSR1 信号会做我需要的。但是,当我发出信号时,它会终止我的程序,该程序仍需要继续侦听新消息。因此,我构建了测试用例程序“test_raise.cpp”:
#include <iostream>
#include <csignal>
int main(){
std::cout << "Ready to raise SIGUSR1." << std::endl;
std::raise(SIGUSR1);
std::cout << "SIGUSR1 has been raised." << std::endl;
}
我正在使用这个编译器:gcc 版本 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1+deb9u1)
生成以下输出
pi@raspberrypi:~$./test_raise
Ready to raise SIGUSR1.
User defined signal 1
pi@raspberrypi:~$
请注意,不会产生第二个文本输出。我看过的所有文档都没有表明 raise 会终止发行程序。(我错过了什么吗?)
这是 raise 的正常功能吗?有没有办法在不终止程序的情况下发出信号?我更好的选择是什么?
谢谢...
根据响应,我有一个程序(在 raise 程序之前调用),它具有 USR1 信号的处理程序:
#include <iostream>
#include <csignal>
#include <unistd.h>
bool flag;
void signalHandler( int signum ) {
std::cout << "Interrupt signal (" << signum
<< ") received." << std::endl;
flag = true;
exit(signum);
}
int main () {
signal(SIGUSR1, signalHandler);
flag = false;
while(1) {
std::cout << "Sleeping...." << std::endl;
if (flag){
std::cout << "SIGUSR1 reception noted by main. "
<< std::endl;
flag = false;
}
sleep(1000*1000); // sleep 1 second
}
return 0;
}
现在有一个处理程序,但从未收到消息,并且 raise 程序仍然在最终消息之前终止。我在这里想念什么?
解决方案
如果您还没有安装信号处理程序来捕获和处理,SIGUSR1
那么默认行为是终止进程。
如果您打算处理信号,请安装适当的信号处理程序并执行处理信号所需的操作。(请记住,在信号处理程序中允许您做的事情很少)。
推荐阅读
- javascript - 如何突出显示和选择多行?
- scala - 如何检查数据库及其与 hikaripool 或 quill 的连接是否正常工作?
- c# - SaveChangesAsync 到数据库上下文是否在 .net 5 隔离的 azure 函数应用程序中的 while 循环内正常
- gam - 在 GAM 中记录转换后的数据,如何绘制响应?
- visual-c++ - visual c++ 6.0 - 重建所有抛出错误 C2259
- python - 每次重新加载模型时,MLP 回归器都会为相同的输入产生不同的输出
- javascript - window.open 打开的页面是否与父页面共享浏览器资源?
- javascript - React 中的动画
- html - 具有可滚动内容的 Bootstrap 5 全屏两列应用程序
- c# - 如何在.Net中集成多个类库项目?