C陷阱与缺陷 第5章 库函数 5.5 库函数signal

本文讨论了C语言中库函数signal用于处理异步事件的方式,特别是信号如何在任何时刻打断程序执行,可能导致的安全问题。信号处理函数不应调用像malloc这样的复杂库函数,且对于算术错误引发的信号,最佳做法是打印错误信息并退出。示例展示了如何设置一个简单的信号处理函数来处理SIGFPE信号。
摘要由CSDN通过智能技术生成

    实际上所有的C语言实现中都包括signal库函数,将其作为捕获异步事件的一种方式。
    要调用该库函数,需要在源文件中加上: 
     #include <signal.h>
    以引入相关的声明。要处理一个特定的signal(信号),可以这样调用signal函数: 
    signal(signal type, handler function);
    signal type代表系统头文件signal.h中定义的某些变量,这些常量用来标识signal函数将要捕获的信号类型。handler function是当指定的事件发生时,将要加以调用的事件处理函数。

    在许多C语言实现中,信号是真正意义上的“异步”。从理论上说,一个信号可能在C程序执行期间的任何时刻发生。需要特别强调的是,信号甚至可能出现在某些复杂库函数(如malloc)的执行过程中。因此,从安全的角度考虑,信号的处理函数不应该调用上述类型的库函数。例如,假设malloc函数的执行过程被一个信号中断。此时,malloc函数可以用来跟踪内存的数据结构很可能部分被更新,如果signal处理函数再调用malloc函数,结果可能是malloc函数用到的数据结构完全崩溃,后果不堪设想!

    基于同样的原因,从signal处理函数中使用longjmp退出,通常情况下也是不安全的:因为信号可能发生在malloc或者其他库函数开始更新某个数据结构,但又没有最后完成的过程中。因此,signal处理函数能够做的安全的事情,似乎就只有设置一个标志然后返回,期待以后主程序能够检查这个标志,发现一个信号已经发生。
    然而,就算这样做也并不总是安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值