← 返回首页
Linux高级程序设计(四十二)
发表时间:2021-11-25 22:29:29
可重入函数

1.可重入函数

可重入函数指的是可以被中断的函数。也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。I/O代码通常不是可重入的,因为它们依赖于像磁盘这样共享的,单独的资源。

Linux的常见可重入函数列表:

2.可重入的条件 1. 不使用返回静态的数据,全局变量(除非用信号量互斥) 2. 不调用动态内存分配,释放的函数 3. 不调用任何可重入的函数(如标准I/O函数)

即使信号处理函数使用的都是可重入函数,也要注意进入函数时要先保存errno的值,结束时再恢复原值。因为在信号处理过程中,errno值随时可能被改变。

实例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{
    //Ctrl+c
    if (sig == SIGINT)
    {
        printf("自定义SIGINT正在处理中....\n");
    }
}
int main(int argc, char *argv[])
{

    signal(SIGINT, handler);
#if 0
    //sleep也是可重入函数,执行完信号处理函数后,不会回到原本的位置继续睡眠
    //sleep(10);
    //alarm也是可重入函数,执行完信号处理函数后,会继续执行不受影响。
    alarm(10);
#endif

#if 1
    char buff[32] = "";
    if (read(0, buff, 20) == -1)
    {
        perror("fail to read:");
        exit(1);
    }
    printf("buff=%s\n",buff);
#endif
    while (1)
    {
        printf("hello,world!\n");
        sleep(1);
    }
    return 0;
}