如果函数在不同逻辑下进行调用会对函数逻辑造成影响这种函数就称之为不可重入函数。
不管怎么调用都对函数内部功能程序逻辑不会造成影响,这种函数称之可重入函数。
一个函数是否可重入:
1.一个函数中是否对全局性数据经行修改操作
2.这个操作是否原子性
通过创建两个全局临时变量,因为两个变量之间具有原子性来演示可重入函数与不可重入函数的区别
void sigcb(int signo)
{
static int a = 1;
static int b = 1;
int c = 0;
a++;
sleep(10);
b++;
c = a + b;
printf("recv signo:%d--%d\n", signo, c);
return;
}
int main()
{
//sighandler_t signal(int signum, sighandler_t handler);
// signum: 信号的编号
// handler: 处理方式
// SIG_IGN 忽略
// SIG_DFL 默认
int i = 0;
signal(SIGINT, sigcb);
signal(SIGQUIT, sigcb);
while(1) {
/*
printf("-----------\n");
kill(getpid(), SIGINT);
if (++i == 3) {
signal(SIGINT, SIG_DFL);
}
*/
sigcb(SIGQUIT);
}
return 0;
}
如果没有添加sleep(10)
我们理想的输出是4,6,8....
但是实际输出是5,6,8...
因为当我们添加sleep之前系统已开始调用,当我们按ctrl+c产生阻断信号,系统重新调用void函数,因为使a的值在sleep之后继续累加1.所以第一次c=5.
可以总结:
不可重入函数的一些重要特点(一般什么是不可重入函数)
函数内部包含对全局性变量的修改操作
函数传参的参数跟其他地方共用同一变量
因为这些对全局性变量的操作不是原子性的,因此这些变量有可能在同时不同地方进行修改。
而可重入函数因为是局部变量修改以后并不会造成这些影响,或者是在阻断的部分已经具有原子性不会对函数造成期望值以外的影响。