当前位置:网站首页>可重入函数
可重入函数
2022-07-22 08:39:00 【Lewin~】
可重入函数
可重入函数是指函数可以由多个任务并发使用,而不必担心数据错误。
意思就是可以被中断的函数,该函数可以在任何时刻中断它,并执行另一块代码, 当执行完毕后,回到原本的代码还可以正常继续运行
编写可重入函数:
1、不使用(返回)静态的数据、全局变量(除非用信号量互斥)。
2、不调用动态内存分配、释放的函数。
3、不调用任何不可重入的函数(如标准 I/O 函数)。
注 即使信号处理函数使用的都是可重入函数(常见的可重入函数),也要注意进入处理函数时,首先要保存 errno 的值,结束时,再恢复原值。因为,信号处理过程中,errno 值随时可能被改变。
常见的可重入函数列表:
案例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
void handler(int sig)
{
printf("SIGINT\n");
}
int main(int argc, char *argv[])
{
signal(SIGINT, handler);
//案例1:
#if 0
//sleep是一个可重入函数,但是当执行信号处理函数之后,不会回到原本的位置继续睡眠
//sleep(10);
//alarm函数是一个可重入函数,当他执行时,如果有信号产生并执行信号处理函数,执行完毕后,会继续运行
alarm(10);
while(1)
{
printf("hello world\n");
sleep(1);
}
#endif
//案例2:
#if 1
char buf[32] = "";
//read也是一个可重入函数,在等待终端输入时,如果产生信号并执行信号处理函数,信号处理
//函数执行完毕后,可以继续输入数据,read可以读取到信号处理函数之后的数据
if(read(0, buf, 20) == -1)
{
perror("fail to read");
exit(1);
}
printf("buf = [%s]\n", buf);
#endif
return 0;
}
边栏推荐
- Maintenance of gbase8s database constraint mode
- 「武汉理工大学 软件工程复习」第三章 | 软件需求
- 「武汉理工大学 软件工程复习」第二章 | 软件过程模型
- 【Excle】生成guid和datetime导入测试数据到数据库
- Go FMT package details
- 逆袭黑马:数据库全栈工程师(DevDBOps)培训,把最好的课程送给您!
- OceanBase数据库搭建测试
- Research on vulnerability identification technology for project version differences
- GBase8s数据库SET CONSTRAINTS 语句
- 「武汉理工大学 软件工程复习」第一章 | 软件工程概述
猜你喜欢
QT notes - qjason
Go concurrent programming - work pool
等额本金递增还款/等额本金递减按揭房贷还款计算器
路由协议是什么
go 并发编程之-工作池
【Rust】我该用什么软件开发 Rust | 常用支持 Rust 的编辑器推荐
What level do programmers need to reach to get 20K monthly salary without pressure?
Installation and introduction of Lin UI component library of wechat applet - Advanced
QT notes - qudpsocket of network communication
学IT,你后悔了么?
随机推荐
基于细粒度嵌入空间预留的密文域图像可逆信息隐藏方法
go fmt包详解
GBase8s数据库MINUS 运算符
QT筆記—— QTableWidget 之 拖拽行數 和 移動
Maintenance of gbase8s database constraint mode
女嘉宾报名
智汇华云 | 集群日志动态采集方案
Multi type low rate DDoS attack detection method based on hybrid deep learning
pm的报警告:“npm WARN config global --global, --local are deprecated
超实用转型攻略:《2022央国企云原生落地实用指南》正式发布
QT笔记—— QTableWidget 之 拖拽行数 和 移动
逆袭黑马:数据库全栈工程师(DevDBOps)培训,把最好的课程送给您!
How MySQL queries the data in JSON data
Super practical transformation strategy: 2022 central state-owned enterprise cloud native landing practical guide was officially released
[bug] datetime format failed
Design of miner type identification mechanism based on reputation management model
「武汉理工大学 软件工程复习」第七章 | 软件测试
Web3 sharing
Research on vulnerability identification technology for project version differences
基于流谱理论的SSL/TLS协议攻击检测方法