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

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

程序功能

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

代码解析

  • 信号处理设置:

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

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

  • 处理函数:

    cpp 复制代码
    void handler(int signum) {
      cout << "I catch a signal:" << signum << endl;
    }

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

潜在问题

  1. 非异步信号安全函数:

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

    • act.sa_mask和act.sa_flags未显式设置。正确做法是清空sa_mask并设置sa_flags:

      cpp 复制代码
      sigemptyset(&act.sa_mask);
      act.sa_flags = 0; // 或 SA_RESTART 以自动重启被中断的系统调用
  3. 程序终止:

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

改进建议

  • 使用安全函数 :

    cpp 复制代码
    void handler(int signum) {
      const char* msg = "I catch a signal:2\n";
      write(STDOUT_FILENO, msg, strlen(msg));
    }
  • 正确初始化sigaction :

    cpp 复制代码
    struct sigaction act = {};
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;

运行示例

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

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

相关推荐
lzx_0022 小时前
Linux 进程(二) 深入理解进程
linux
沫璃染墨3 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
温暖小土3 小时前
在 CentOS 上安装 Redis Stack
linux·redis·centos
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
GeW5 小时前
国产化替代进入深水区之后Linux 与数据库为什么必须走向重建
linux
旖旎夜光5 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记6 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw7 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨8 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
女神下凡8 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范