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

非异步信号安全函数

这个程序演示了如何使用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命令终止。

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

相关文章:

  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的低集中度市场运营策略研究
  • Android多媒体——媒体解码流程分析(十四)
  • unordered_map和unordered的介绍和使用
  • 记录算法笔记(20025.5.14)对称二叉树
  • 【教程】Docker更换存储位置
  • 【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
  • Redis的热Key问题如何解决?
  • PostgREST:无需后端 快速构建RESTful API服务
  • 【MySQL】日志缓冲区详解 以及 InnoDB内存结构总结
  • TrimAl介绍
  • RPM 包制作备查 SRPM 包编译
  • 高并发内存池(四):Page Cache结构设计
  • 青少年编程与数学 02-019 Rust 编程基础 12课题、所有权系统
  • AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)
  • NLP的基本流程概述
  • 深度剖析 GpuGeek 实例:GpuGeek/Qwen3-32B 模型 API 调用实践与性能测试洞察
  • LeetCode 热题 100_颜色分类(98_75_中等_C++)(技巧)(计数;双指针)
  • Shell和Bash介绍
  • 学习threejs,使用Physijs物理引擎,通过控制重力,实现多米诺骨牌效果
  • Data Mining|缺省值补全实验
  • 国内首家破产的5A景区游客爆满,洛阳龙潭大峡谷:破产并非因景观不好
  • 第四届长三角国际应急博览会开幕,超3000件前沿装备技术亮相
  • 夜读丨取稿费的乐趣
  • 行知读书会|换一个角度看见社会
  • 听企业聊感受,《外企聊营商》5月13日起推出
  • 高培勇:中国资本市场的发展应将预期因素全面纳入分析和监测体系