当前位置:网站首页>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处理函数尽可能简单,并将它们组织在一起。这样,当需要适应一个新系统时,我们可以很容易进行修改。
边栏推荐
- 织梦模板加入php代码
- Failed to re-init queues : Illegal queue capacity setting (abs-capacity=0.6) > (abs-maximum-capacity
- To promote energy conservation institute 】 【 the opinions of the agricultural water price reform
- 密码学的基础:X.690和对应的BER CER DER编码
- 案例:MySQL主从复制与读写分离
- Get started quickly with MongoDB
- Pytorch框架学习记录13——利用GPU训练
- 虚拟机的IP地址自动变为127.0.0.1
- Godaddy domain name resolution is slow and how to use DNSPod resolution to solve it
- Interpretation of the meaning of each dimension of two-dimensional, three-dimensional, and four-dimensional matrices
猜你喜欢
4.1 配置Mysql与注册登录模块
[Personal work] Wireless network image transmission module
R语言进行相关的操作
MySQL 中出现的字符编码错误 Incorrect string value: ‘\x\x\x\x‘ for column ‘x‘
STAHL touch screen repair all-in-one display screen ET-316-TX-TFT common faults
有点奇怪!访问目的网址,主机能容器却不行
徒步,治好了我的精神内耗
Imitation cattle forum project
【Untitled】
Buttons with good user experience should not have hover state on mobile phones
随机推荐
LinkedList源码分享
LinkedList source code sharing
通俗解释:什么是临床预测模型
扣减库存方案
函数(二)
如何封装 cookie/localStorage/sessionStorage hook?
这些 hook 更优雅的管理你的状态
使用百度EasyDL实现厂区工人抽烟行为识别
微信小程序云开发|个人博客小程序
列表页常见的 hook 封装
Interview assault 70: what is the glue bag and a bag?How to solve?
Internet使用的网络协议是什么
线上问题排查常用命令,总结太全了,建议收藏!!
Zheng Xiangling, Chairman of Tide Pharmaceuticals, won the "2022 Outstanding Influential Entrepreneur Award" Tide Pharmaceuticals won the "Corporate Social Responsibility Model Award"
Interpretation of the meaning of each dimension of two-dimensional, three-dimensional, and four-dimensional matrices
Imitation cattle forum project
Redis does web page UV statistics
Based on FPGA in any number of bytes (single-byte or multibyte) serial port (UART) to send (including source engineering)
OSG Notes: Set DO_NOT_COMPUTE_NEAR_FAR to manually calculate far and near planes
人工智能可信安全与评测