可重入函数

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;
}

以上是关于可重入函数的主要内容,如果未能解决你的问题,请参考以下文章

可重入函数

线程安全和可重入函数

单片机C语言设计里说的可重入函数是啥?和不可重入函数的区别是啥?

可重入和线程安全

可重入概念

如何判断一个函数是不是可重入