当前位置:网站首页>C陷阱与缺陷 第5章 库函数 5.5 库函数signal
C陷阱与缺陷 第5章 库函数 5.5 库函数signal
2022-08-01 21:00:00 【weixin_客子光阴】
实际上所有的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处理函数能够做的安全的事情,似乎就只有设置一个标志然后返回,期待以后主程序能够检查这个标志,发现一个信号已经发生。
然而,就算这样做也并不总是安全的。当一个算术运算错误(例如溢出或者零作除数)引发一个信号时,某些机器在signal处理函数返回后还将重新执行失败的操作。而当这个算术运算重新执行时,我们并没有一个可移植的办法来改变操作数。在这种情况下,最可能的结果就是马上由引发一个同样的信号。因此,对于算术运算错误,signal处理函数的唯一安全、可移植的操作就是打印一条出错信息,然后使用longjmp或exit立即退出程序。
我们得到的结果是:信号非常复杂棘手,而且具有一些从本质上而言不可移植的特性。要解决这个问题,我们最好采取“守势”,让signal处理函数尽可能简单,并将它们组织在一起。这样,当需要适应一个新系统时,我们可以很容易进行修改。
边栏推荐
- [Energy Conservation Institute] Ankerui Food and Beverage Fume Monitoring Cloud Platform Helps Fight Air Pollution
- JS提升:手写发布订阅者模式(小白篇)
- string
- MySQL Syntax Basics
- tiup mirror merge
- R语言 线性回归的有关方法
- 15 分钟带你入门 Grafana
- 通过这两个 hook 回顾 Set/Map 基础知识
- [Energy Conservation Institute] Application of Intelligent Control Device in High Voltage Switchgear
- 2022年秋招,软件测试开发最全面试攻略,吃透16个技术栈
猜你喜欢

To promote energy conservation institute 】 【 the opinions of the agricultural water price reform

职场如象棋,测试/开发程序员如何突破成长瓶颈期?

R语言 线性回归的有关方法

网红驼背矫正产品真的管用吗?如何预防驼背?医生说要这样做

OSG笔记:设置DO_NOT_COMPUTE_NEAR_FAR,手动计算远近平面
![漏洞分析丨HEVD-0x6.UninitializedStackVariable[win7x86]](/img/37/09ab9b5a490c6ab9bc7991ecc4c8f4.png)
漏洞分析丨HEVD-0x6.UninitializedStackVariable[win7x86]

进行交互或动画时如何选择Visibility, Display, and Opacity

函数(二)

Buttons with good user experience should not have hover state on mobile phones

30+的女性测试人面试经验分享
随机推荐
使用员工管理软件,解锁人力生产力新水平,提高人力资源团队灵活性
Hiking, cured my mental internal friction
虚拟机的IP地址自动变为127.0.0.1
LeetCode每日一题(1807. Evaluate the Bracket Pairs of a String)
[Energy Conservation Institute] Ankerui Food and Beverage Fume Monitoring Cloud Platform Helps Fight Air Pollution
LinkedList源码分享
网络安全与基础设施安全局(CISA):两国将在网络安全方面扩大合作
线上问题排查常用命令,总结太全了,建议收藏!!
Pytorch框架学校记录11——搭建小实战完整细节
STAHL触摸屏维修一体机显示屏ET-316-TX-TFT常见故障
织梦通过数据库查询调用当前文章的留言
乐观锁批量跟新 纯SQL
Remove 360's detection and modification of the default browser
案例:MySQL主从复制与读写分离
面试突击70:什么是粘包和半包?怎么解决?
WeChat applet cloud development | personal blog applet
Simple test of the use of iptables
【luogu P1912】诗人小G(二分栈)(决策单调性优化DP)
如何封装 cookie/localStorage/sessionStorage hook?
任务调度线程池-应用定时任务