首页 > 解决方案 > 调用 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 程序仍然在最终消息之前终止。我在这里想念什么?

标签: c++signals

解决方案


如果您还没有安装信号处理程序来捕获和处理,SIGUSR1那么默认行为是终止进程。

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


推荐阅读