C++ signal
ISO C标准支持的信号
信号名称 | 含义 | 默认行为 |
---|---|---|
SIGABRT | 异常终止信号,一般通过调用abort函数产生 | terminate+core |
SIGINT | 中断信号,一般通过键盘输入ctrl+c 产生 |
terminate |
SIGSEGV | 段错误信号,一般通过访问非法地址产生 | terminate+core |
SIGTERM | 终止信号,kill 命令默认发送该信号 |
terminate |
SIGFPE | 浮点错误信号,比如除0,浮点计算溢出等 | terminate+core |
SIGILL | 错误指令信号 | terminate+core |
处理信号的三种方式
- 忽略信号(SIG_IGN):忽略信号,不做任何处理,但是
SIGKILL
和SIGSTOP
是不可以被忽略和捕捉的,并且最好不要忽略硬件产生的信号,否则行为未定义。 - 捕捉信号(sighandler):捕捉信号,执行指定的动作。
- 默认行为(SIG_DFL):执行信号的默认行为。
signal async safe的系统函数
可靠信号与不可靠信号
signal比sigaction简单,但signal注册的信号在sa_handler被调用之前把会把信号的sa_handler指针恢复,而sigaction注册的信号在处理信号时不会恢复sa_handler指针:
int sig_int(); /* my signal handling function */
...
signal(SIGINT, sig_int); /* establish handler */
...
sig_int()
{
signal(SIGINT, sig_int); /* reestablish handler for next time */
}
上面的代码大部分情况可以正常运行,但一些特殊情况,比如SIGINT
信号触发之后,在执行到sig_int
的重置语句之前,又触发了SIGINT
,这时会执行默认行为——也就是退出函数,就会有问题。
信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号,可靠信号克服了信号可能丢失的问题。Linux在支持新版本的信号安装函数sigation()以及信号发送函数sigqueue()的同时,仍然支持早期的signal()信号安装函数,支持信号发送函数kill()。
信号的可靠与不可靠只与信号值有关,与信号的发送及安装函数无关。目前linux中的signal()是通过sigation()函数实现的,因此,即使通过signal()安装的信号,在信号处理函数的结尾也不必再调用一次信号安装函数。同时,由signal()安装的实时信号支持排队,同样不会丢失。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2020-01-02 C++中线程安全单例模式的正确实现方式