news 2026/4/15 15:29:49

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/4/15 15:28:12

Elementor 自带的progress bar组件如何去掉百分比%符号

Elementor 自带的progress bar 使用的时候&#xff0c;如下图&#xff1a;则在前端&#xff0c;它会显示成这样&#xff1a;如果想去掉百分比%符号&#xff0c;可以按下面的方法步骤&#xff1a;1. 选中组件&#xff0c;然后到Advanced>CSS Classes 中填写 no-percent-progr…

作者头像 李华
网站建设 2026/4/15 15:21:43

Keil uVision5使用教程:一文说清RTOS在工控中的集成方法

从零开始掌握 Keil uVision5 中的 RTOS 集成&#xff1a;工控开发实战指南你有没有遇到过这样的场景&#xff1f;一个简单的温控系统&#xff0c;既要定时采集传感器数据&#xff0c;又要刷新显示屏&#xff0c;还得响应按键操作和串口指令。用传统的“主循环轮询”方式写代码&…

作者头像 李华
网站建设 2026/4/15 15:20:53

Altium Designer在温度控制系统中的项目应用

从原理到量产&#xff1a;用 Altium Designer 打造高精度温度控制系统 在工业自动化、医疗设备和精密仪器领域&#xff0c;一个稳定可靠的温度控制系统&#xff0c;往往决定了整台设备的性能上限。无论是恒温培养箱、半导体工艺加热平台&#xff0c;还是高端家电中的智能温控模…

作者头像 李华
网站建设 2026/4/15 15:21:54

桥式整流电路设计要点:整流二极管实战案例

从一颗二极管说起&#xff1a;桥式整流电路的实战设计陷阱与避坑指南你有没有遇到过这样的情况——电源板莫名其妙“冒烟”&#xff0c;拆开一看&#xff0c;桥堆炸了&#xff1f;或者设备在高温环境下频繁重启&#xff0c;排查半天发现是整流环节出了问题&#xff1f;别急&…

作者头像 李华
网站建设 2026/4/15 15:21:54

图解说明usb_burning_tool固件定制中的关键参数设置

深入剖析usb_burning_tool刷机工具&#xff1a;从参数配置到量产落地的实战指南 你有没有遇到过这样的场景&#xff1f; 产线上的TV Box批量烧录&#xff0c;几十台设备同时连接PC&#xff0c;结果一半“脱机”&#xff0c;三分之一写入失败&#xff0c;还有几台直接变砖……排…

作者头像 李华
网站建设 2026/4/15 15:19:25

快速理解继电器驱动电路设计关键步骤

从零搞懂继电器驱动电路&#xff1a;工程师避坑实战指南你有没有遇到过这种情况——明明代码写得没问题&#xff0c;MCU也正常输出高电平&#xff0c;可继电器就是“抽风”&#xff1a;时而吸合、时而不吸&#xff1b;更糟的是&#xff0c;某天突然烧了单片机IO口&#xff0c;甚…

作者头像 李华