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