信号之函数的可重入性
在调用某个函数过程中出现中断信号,且改信号处理函数中再次调用该函数,访问全局、静态变量的函数是不可重入函数。
前后数据不一致,函数是不可重入的,特点:函数中使用全局变量或静态变量。
前后数据一致,函数是可重入的,特征:函数中使用局部变量。
root@spark# cat reinside.c
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>int g_v[10];
int *h_v;void set(int n)
{printf("begin running set.....\n");int p_v[10];for (int i = 0; i < 10; i++) {p_v[i] = n;h_v[i] = n;g_v[i] = n;sleep(1);}printf("p_v:");for (int i = 0; i < 10; i++) {printf("%d ", p_v[i]);}printf("\n");printf("g_v:");for (int i = 0; i < 10; i++) {printf("%d ", g_v[i]);}printf("\n");printf("h_v:");for (int i = 0; i < 10; i++) {printf("%d ", h_v[i]);}printf("\n");printf("end running set....\n");return;
}void sig_hander(int signo)
{printf("%d receive sigal SIGTSTP...\n", getpid());if (signal(SIGTSTP, sig_hander) == SIG_ERR) {perror("sig_hander signal fail");}set(20);return;
}int main(void)
{if (signal(SIGTSTP, sig_hander) == SIG_ERR) {perror("signal fail");}h_v = (int *)malloc(sizeof(int)*10);if (h_v == NULL) {perror("malloc h_v fail");}printf("begin running main....\n");set(10);printf("end running main....\n");return 0;
}
root@spark# ./reinside
begin running main…
begin running set…
^Z19559 receive sigal SIGTSTP…
begin running set…
p_v:20 20 20 20 20 20 20 20 20 20
g_v:20 20 20 20 20 20 20 20 20 20
h_v:20 20 20 20 20 20 20 20 20 20
end running set…
p_v:10 10 10 10 10 10 10 10 10 10
g_v:20 20 20 20 20 10 10 10 10 10
h_v:20 20 20 20 20 10 10 10 10 10
end running set…
end running main…
root@spark#
运行5秒的时候按下ctrl+z, main函数中调用set函数中的全局变量内容被改写。