调用 raise(signal) 会终止 c++ 程序

Invoking raise(signal) terminates c++ program

本文关键字:终止 c++ 程序 raise signal 调用      更新时间:2023-10-16

我的树莓派上运行着两个程序。 一个与用户交互,另一个侦听消息并在指示时更新消息文件。 我希望另一个向第一个发出消息已更新的信号,以便第一个可以重新加载消息文件。 我虽然一个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 程序之前调用(,它有一个用于 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则默认行为是终止进程。

如果您打算处理信号,请安装适当的信号处理程序并执行处理信号所需的操作。(请记住,在信号处理程序中允许执行的操作很少(。