阅读下面三段代码:
思考:为何会出现这样的结果?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int a=0,b=0;
int test()
{
a++;
b++;
return a+b;
}
int main(){
printf("main:%d\n",test());
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
int a=0,b=0;
int test()
{
a++;
sleep(3);
b++;
return a+b;
}
void sigcb()
{
printf("signal:%d\n",test());
}
int main(){
signal(SIGINT,sigcb);
printf("main:%d\n",test());
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
int a=0,b=0;
int test()
{
a++;
b++;
sleep(3);
return a+b;
}
void sigcb()
{
printf("signal:%d\n",test());
}
int main(){
signal(SIGINT,sigcb);
printf("main:%d\n",test());
return 0;
}
函数的重入
在多个执行流程中,重复进入同一个函数进行执行
可重入函数:一个函数重入之后不会出现问题
不可重入函数:一个函数重入之后有可能造成数据二义或者逻辑混乱。
判断基准:在一个函数中,是否对一个全局数据
进行了不受保护的非原子操作
。如果是,则该函数是一个可重入函数;如果不是,则它是一个不可重入函数。