news 2026/3/25 2:54:50

C++ 信号处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 信号处理

C++ 信号处理基础

信号是操作系统用于通知进程发生某种事件的机制,例如用户按下Ctrl+CSIGINT)或程序访问非法内存(SIGSEGV)。C++ 通过<csignal>头文件提供信号处理支持。

常用信号类型

  • SIGINT:终端中断(如Ctrl+C)。
  • SIGSEGV:非法内存访问。
  • SIGTERM:终止请求(如kill命令)。
  • SIGALRM:定时器超时(alarm()触发)。

注册信号处理函数

使用signal()或更安全的sigaction()注册信号处理函数:

#include <csignal> #include <iostream> void handler(int signal) { std::cout << "Received signal: " << signal << std::endl; } int main() { signal(SIGINT, handler); // 注册 SIGINT 处理函数 while (true) {} // 模拟长时间运行 return 0; }

使用sigaction增强控制

sigaction提供更细粒度的信号控制(如屏蔽其他信号):

#include <csignal> #include <iostream> void handler(int signal) { std::cout << "Safe handling of signal: " << signal << std::endl; } int main() { struct sigaction sa; sa.sa_handler = handler; sigemptyset(&sa.sa_mask); // 不屏蔽其他信号 sa.sa_flags = 0; sigaction(SIGINT, &sa, nullptr); // 替换 signal() while (true) {} return 0; }

发送信号

使用kill()raise()发送信号:

#include <csignal> #include <unistd.h> int main() { raise(SIGINT); // 向自身发送 SIGINT kill(getpid(), SIGTERM); // 等效于 raise(SIGTERM) return 0; }

信号与多线程

在多线程程序中,信号的处理需谨慎:

  • 信号可能被任意线程捕获。
  • 使用pthread_sigmask()控制线程的信号屏蔽。
#include <pthread.h> #include <csignal> void* thread_func(void*) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, SIGINT); pthread_sigmask(SIG_BLOCK, &mask, nullptr); // 屏蔽 SIGINT while (true) {} return nullptr; }

异步信号安全

信号处理函数中只能调用异步信号安全函数(如write(),避免coutmalloc):

#include <unistd.h> #include <csignal> void handler(int) { write(STDOUT_FILENO, "Signal!\n", 8); // 安全 }

定时信号示例

使用alarm()SIGALRM实现定时器:

#include <unistd.h> #include <csignal> #include <iostream> void alarm_handler(int) { std::cout << "Alarm triggered!" << std::endl; } int main() { signal(SIGALRM, alarm_handler); alarm(2); // 2 秒后触发 SIGALRM pause(); // 等待信号 return 0; }

注意事项

  • 避免在信号处理函数中执行复杂操作。
  • 多线程程序优先使用线程同步机制而非信号。
  • sigactionsignal更可控,推荐使用。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/23 18:21:03

vivado安装包多版本共存:基础方案深度剖析技巧

Vivado多版本共存实战指南&#xff1a;从安装冲突到高效切换的完整解决方案 你有没有遇到过这样的场景&#xff1f; 手头要维护一个基于Zynq-7000的老项目&#xff0c;只能用Vivado 2020.1打开&#xff1b;同时新任务又要求使用Vivado 2023.1开发Versal ACAP平台。结果一启动…

作者头像 李华
网站建设 2026/3/24 15:51:27

超详细版:Vitis AI推理部署全流程图解说明

Vitis AI推理部署实战&#xff1a;从模型到硬件的全链路拆解一场“AI下地”的硬仗&#xff1a;为什么我们需要Vitis AI&#xff1f;在边缘端跑深度学习模型&#xff0c;不是把PyTorch脚本拷贝过去那么简单。你有没有遇到过这样的场景&#xff1a;模型训练完精度很高&#xff0c…

作者头像 李华
网站建设 2026/3/24 8:23:56

PCB电路图模块划分技巧——Altium Designer实践

看懂复杂PCB电路图的钥匙——Altium Designer中的模块化设计实战你有没有过这样的经历&#xff1f;打开一张密密麻麻的多层PCB图纸&#xff0c;满屏都是走线和元件&#xff0c;想找一个电源网络却像在迷宫里打转&#xff1b;或者接手别人的项目时&#xff0c;原理图一页铺到底&…

作者头像 李华
网站建设 2026/3/23 17:35:38

pjsip项目起步:跨平台构建方法详解

pjsip 构建实战&#xff1a;从零开始掌握跨平台编译的“正确姿势”你有没有过这样的经历&#xff1f;满怀信心地克隆下pjproject源码&#xff0c;运行./configure&#xff0c;结果终端里跳出一连串红色错误&#xff1a;ALSA headers not foundundefined reference to pthread_c…

作者头像 李华
网站建设 2026/3/24 16:56:31

低功耗RS232硬件电路设计从零实现

低功耗RS232电路设计&#xff1a;如何让“老古董”接口跑进物联网时代&#xff1f; 你有没有遇到过这样的尴尬&#xff1f; 在开发一款电池供电的工业传感器时&#xff0c;客户坚持要用RS232通信——理由是“我们的上位机系统用了20年&#xff0c;不能换”。你心里一沉&#x…

作者头像 李华
网站建设 2026/3/24 10:55:03

基于Altium Designer的端子排设计完整指南

从零开始掌握Altium Designer中的端子排设计&#xff1a;工程师的实战指南在工业控制柜、自动化设备和嵌入式系统中&#xff0c;你是否曾因一个接线错误导致整块板子烧毁&#xff1f;或者在现场调试时发现“V”和“GND”被反接&#xff0c;排查半天才发现是端子编号混乱&#x…

作者头像 李华