linux信号处理函数的可重入性

来源:互联网 发布:淘宝卖什么销量最好 编辑:程序博客网 时间:2024/06/05 03:50

在信号处理函数中,尽量使用可重入的函数接口(即操作的数据都是在堆栈上,不涉及全局变量),否则会引起数据的崩溃。一个简单的演示程序可以说明这点。

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


int a=0;


void  handleSig5(int num, siginfo_t * info, void * no_used)
{
a = 5;
printf("before kill a = %d\n", a);


kill(getpid(), 6);


printf("after kill a = %d\n", a);
return;
}


void  handleSig6(int num, siginfo_t * info, void * no_used)
{
printf("set a to 6\n");
a = 6;
return ;
}


int main(void) 
{
struct sigaction act;
act.sa_handler = handleSig5;


sigaction(5, &act, NULL);


act.sa_handler = handleSig6;
sigaction(6, &act, NULL);


printf("[%ld]wait a signal....\n", getpid());
getchar();


return 0;


}


在终端里手动向该进程发一个信号值为5的信号,其输出结果为

[2771]wait  a  signal....

before kill  a = 5

set   a  to  6

after  kill  a = 6


从以上的结果可以看出,如果两个信号处理程序有共享同一个全局的变量 ,可能会导致数据观察的不一致性,引起程序的崩溃,这里也可以看出信号的处理不是

串行执行的,是可以交错执行的,基本上进程从内核态返回到用户态之前都对会挂起的信号执行检查,以执行相应的信号处理程序(信号处理程序是运行在用户态下的)






原创粉丝点击