可重入函数
Posted studying~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可重入函数相关的知识,希望对你有一定的参考价值。
可重入函数
可重入函数是指函数可以由多个任务并发使用,而不必担心数据错误。
意思就是可以被中断的函数,该函数可以在任何时刻中断它,并执行另一块代码, 当执行完毕后,回到原本的代码还可以正常继续运行
编写可重入函数:
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;
}
以上是关于可重入函数的主要内容,如果未能解决你的问题,请参考以下文章