当前位置:网站首页>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处理函数尽可能简单,并将它们组织在一起。这样,当需要适应一个新系统时,我们可以很容易进行修改。
边栏推荐
- 4.1 配置Mysql与注册登录模块
- STAHL触摸屏维修一体机显示屏ET-316-TX-TFT常见故障
- idea实用快捷键合集——持续更新
- Goroutine Leaks - The Forgotten Sender
- 进行交互或动画时如何选择Visibility, Display, and Opacity
- 人工智能可信安全与评测
- SkiaSharp 之 WPF 自绘 五环弹动球(案例版)
- Hiking, cured my mental internal friction
- Redis does check-in statistics
- Failed to re-init queues : Illegal queue capacity setting (abs-capacity=0.6) > (abs-maximum-capacity
猜你喜欢
Little data on how to learn?Jida latest small learning data review, 26 PDF page covers the 269 - page document small data learning theory, method and application are expounded
函数(二)
Application of Acrel-5010 online monitoring system for key energy consumption unit energy consumption in Hunan Sanli Group
excel高级绘图技巧100讲(二十二)-如何对不规则数据进行分列
【Kaggle】House Prices
职场如象棋,测试/开发程序员如何突破成长瓶颈期?
Interview assault 70: what is the glue bag and a bag?How to solve?
Postman 批量测试接口详细教程
[Energy Conservation Institute] Application of Intelligent Control Device in High Voltage Switchgear
[Multi-task model] Progressive Layered Extraction: A Novel Multi-Task Learning Model for Personalized (RecSys'20)
随机推荐
关于Request复用的那点破事儿。研究明白了,给你汇报一下。
iptables的使用简单测试
R语言 数据的关系探索
Redis does check-in statistics
数据库单字段存储多个标签(位移操作)
响应式织梦模板美容整形类网站
Pytorch框架学习记录12——完整的模型训练套路
MySQL 中出现的字符编码错误 Incorrect string value: ‘\x\x\x\x‘ for column ‘x‘
数据库内核面试中我不会的问题(1)
tiup mirror genkey
通俗解释:什么是临床预测模型
面试官:大量请求 Redis 不存在的数据,从而打倒数据库,有什么方案?
Pytorch框架学习记录13——利用GPU训练
仿牛客论坛项目
Zheng Xiangling, Chairman of Tide Pharmaceuticals, won the "2022 Outstanding Influential Entrepreneur Award" Tide Pharmaceuticals won the "Corporate Social Responsibility Model Award"
Buttons with good user experience should not have hover state on mobile phones
[Energy Conservation Institute] Comparative analysis of smart small busbar and column head cabinet solutions in data room
C专家编程 第1章 C:穿越时空的迷雾 1.5 今日之ANSI C
列表页常见的 hook 封装
Nacos 配置中心