首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我在Ubuntu终端上发送SIGTERM (Ctrl + C)时,我的C++代码没有终止?

为什么当我在Ubuntu终端上发送SIGTERM (Ctrl + C)时,我的C++代码没有终止?
EN

Stack Overflow用户
提问于 2020-07-16 02:34:34
回答 1查看 430关注 0票数 0

我编写了一个从USB读取数据的程序。代码是这样的:

代码语言:javascript
复制
#include "ros/ros.h"
#include <iostream>
#include <fstream>
#include <string>

int main(int argc, char **argv){
    ros::init(argc, argv, "read_usb");
    ros::NodeHandle nh;
    ros::Rate loop_rate(100);
    while(ros::ok()){       
        std::string str;
        std::fstream openmv_cam_h7;
        openmv_cam_h7.open("/dev/ttyACM0");     
        while(openmv_cam_h7 >> str){
            std::cout << str << std::endl;
        }
        openmv_cam_h7.close();
        ros::spinOnce();
        loop_rate.sleep();
    }
}

当我运行这个程序的时候,它进行得很好。但是当我想通过在Ubuntu终端上按Ctrl+C (SIGTERM)来终止它时,程序继续运行。只有当我拔掉用来发送数据的USB设备时,它才会终止。

这一切为什么要发生?如果我希望程序在发送SIGTERM信号时终止,该怎么办?

附加信息:我的操作系统是Ubuntu18.04,我使用ROS旋律。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 04:00:41

通常情况下,按Ctrl+C会杀死你的程序,不会有任何问题。

以下是我的怀疑和解决方案:

  1. Ubuntu可能有问题,没有向应用程序发送SIGTERM。若要测试Ubuntu是否正确工作,请创建一个空程序,其中包含一个时间(True) {}循环(只需永久阻塞),并测试是否可以CTRL+C该程序。如果它退出,那么您的代码就会有问题。

如果

  1. 1有效,那么我觉得loop_rate.sleep()或ros::spinOnce()可能在某种程度上导致了捕捉SIGTERM的问题。睡眠或spinOnce可能会锁定应用程序的小时间(谁知道)。尝试删除它们并重新测试CTRL+C。另外,尝试多次(快速)粉碎CTRL+C,看看是否触发了退出。如果这确实有效,那么您将需要弄清楚为什么ROS / and ()或spinOnce()方法会(间歇性地)锁定应用程序,因此不会捕获SIGTERM.

  1. ROS可能已经将SIGTERM处理程序本身挂在库中,并且可能正在使用它做一些事情(不明显退出)。如果是这样的话,您可能必须在主目录中添加自己的SIGTERM处理程序,这样就可以捕获CTRL+C,然后手动调用exit() .

试试看,然后再联系我们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62926554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档