可重入函数

不可重入函数:如果函数在不同的地方/时序进行调用,会对函数的功能逻辑造成影响

可重入函数:不管怎么调用都不会对函数内部功能/程序逻辑造成影响(局部变量)

下面具体演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
* 这是一个演示signal接口修改信号处理方式的demo
* 信号的处理方式有三种:
* 忽略
* 默认
* 自定义
*/

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

void sigcb(int signo)
{
static int a= 1;//静态变量,再次进入可能会产生不是预期的结果
static int b = 1;
int c = 0;

a++;
sleep(10);
b++;
c= a + b;
printf("receive signo:%d---%d\n",signo,c);
/* if(signo == SIGINT ) //因为可能有很多信号来调用这个函数,所以需要做出判断
{
}
else
{
}
*/
return;
}


int main()
{
// sighandler_t signal(int signum, sighandler_t handler);
//signum:信号的编号
//handler:处理方式
// SIG_IGN 忽略
// SIG_DFL 默认
int i = 0;
//signal(SIGINT,SIG_IGN); //提前备注,当这个信号到来时忽略它
signal(SIGINT,sigcb); //自定义方式处理
while(1)
{
/*printf("--------------\n");
kill(getpid(),SIGINT);
if(++i == 3)
{
signal(SIGINT,SIG_DFL);
}*/

sigcb(SIGQUIT);
}
return 0;
}

运行程序时输入Ctrl+C,发现出现下边的情况:

运行结果

这是为什么呢?图解如下:

运行结果

不可重入函数的要点(什么函数是不可重入函数):

1.函数内部包含有对全局性变量的修改操作

2.函数传参的参数跟其他地方共同使用同一个变量

因为这些对全局变量的操作不是原子性的,因此这些修改操作有可能同时在不同地方进行修改

一个函数是否可重入:

1.是否对全局性的数据进行修改操作(malloc是用全局链表来管理堆的)

2.这个操作是否是原子性的

0%