调用 raise(signal) 会终止 c++ 程序
Invoking raise(signal) terminates c++ program
我的树莓派上运行着两个程序。 一个与用户交互,另一个侦听消息并在指示时更新消息文件。 我希望另一个向第一个发出消息已更新的信号,以便第一个可以重新加载消息文件。 我虽然一个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
则默认行为是终止进程。
如果您打算处理信号,请安装适当的信号处理程序并执行处理信号所需的操作。(请记住,在信号处理程序中允许执行的操作很少(。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- llvm构建器向基本块添加终止符
- 如何使用隔离>终止执行来停止所有线程
- 用于将C++代码转换为 Web 程序集的脚本未终止
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 终止 QProcess 不会终止子进程
- 运行代码时,c++ 会终止进程
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 在输入句子时终止 std::out_of_range
- 二进制搜索的终止点
- MPI:检查是否有任何进程已终止
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- while 循环不以哨兵值终止
- C++ 程序不会因为内存而终止
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常