当前位置: 首页 > news >正文

C++信号处理程序解析与改进

这个程序演示了如何使用sigaction来捕获和处理信号(特别是SIGINT,即Ctrl+C)。以下是关键点和潜在问题的分析:

程序功能

  1. 信号捕获:注册自定义处理函数handler来捕获信号2(SIGINT,通常由Ctrl+C触发)
  2. 循环输出:主函数无限循环每秒打印进程PID,捕获信号后继续运行,而非终止。

代码解析

  • 信号处理设置

    struct sigaction act;
    act.sa_handler = handler; // 设置信号处理函数
    sigaction(2, &act, &olact); // 注册SIGINT的处理方式
    

    使用sigaction替换默认信号处理,旧的处理方式保存在olact中。

  • 处理函数

    void handler(int signum) {cout << "I catch a signal:" << signum << endl;
    }
    

    当SIGINT触发时,输出信号编号。

潜在问题

  1. 非异步信号安全函数

    • cout在信号处理函数中使用可能不安全。信号处理应仅使用异步信号安全函数(如write),避免竞争条件。
  2. 未初始化sigaction结构体

    • act.sa_maskact.sa_flags未显式设置。正确做法是清空sa_mask并设置sa_flags
      sigemptyset(&act.sa_mask);
      act.sa_flags = 0; // 或 SA_RESTART 以自动重启被中断的系统调用
      
  3. 程序终止

    • 捕获SIGINT后,Ctrl+C无法终止程序。需通过其他信号(如kill -9 PID)终止。

改进建议

  • 使用安全函数
    void handler(int signum) {const char* msg = "I catch a signal:2\n";write(STDOUT_FILENO, msg, strlen(msg));
    }
    
  • 正确初始化sigaction
    struct sigaction act = {};
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    

运行示例

  1. 编译并运行程序后,按下Ctrl+C会触发handler,输出信号信息。
  2. 程序继续运行,需用kill命令终止。

该程序展示了信号处理的基本用法,但需注意安全性和结构体初始化以确保稳定。

相关文章:

  • OpenCV在图像上绘制文字示例
  • 【深度学习】为什么2个3×3的卷积可以相当于一个5×5的卷积核?为什么3个3×3的卷积相当于一个7×7的卷积核,到底区别在哪里?我们该如何使用?
  • 探索未知惊喜,盲盒抽卡机小程序系统开发新启航
  • AMFCNN-RKD:齿轮故障诊断的轻量级多传感器融合模型详解(python代码复现)
  • 用函数实现模块化程序设计(适合考研、专升本)
  • 【C++项目】负载均衡在线OJ系统-2
  • 深入学习RabbitMQ队列的知识
  • 第11期_网站搭建_极简云 单码网络验证修复版本 虚拟主机搭建笔记
  • CLIP多模态大模型的优势及其在边缘计算中的应用
  • Day13
  • 热门消息中间件汇总
  • 八、Python模块、包
  • 第四十五天打卡
  • PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject的区别
  • React 第五十四节 Router中useRevalidator的使用详解及案例分析
  • AI智能推荐实战之RunnableParallel并行链
  • Haproxy的基础配置
  • AI问答-vue3+ts+vite:http://www.abc.com:3022/m-abc-pc/#/snow 这样的项目 在服务器怎么部署
  • vue+element-ui一个页面有多个子组件组成。子组件里面有各种表单,实现点击enter实现跳转到下一个表单元素的功能。
  • Excel-vlookup -多条件匹配,返回指定列处的值
  • 计算机科学与技术/百度seo规则最新
  • 网站主色调有几种/如何让百度快速收录新网站
  • pc网站增加手机站/无锡网络推广外包
  • 惠州的企业网站建设/最好用的搜索引擎
  • 做美图 网站有哪些东西吗/企业培训机构哪家最好
  • 做戒指网站的logo照片/南昌seo排名