日期:2014-05-16  浏览次数:20617 次

Linux系统中子进程向父进程发送信号
#include<stdio.h>
#include<stdlib.h>

int counter = 0;

void handler(int sig)
{
counter++;
sleep(1);
return;
}

int main(void)
{
int i;

signal(SIGUSR2, handler);

if (fork() == 0) {
for (i = 0; i < 5; i++) {
kill(getppid(), SIGUSR2);
printf("sent SIGUSR2 to parent\n");
}
exit(0);
}

wait(NULL);
printf("counter = %d\n", counter);
exit(0);
}

此程序中,通过信号SIGUSR2想父进程发送了5次信号处理全局变量counter加1,但是最终的结果counter却不是得到5,大家帮忙给解释下原因,多谢啦!
Linux 信号 进程 Linux?kill

------解决方案--------------------
非可靠信号不排队,且执行信号处理程序时,会自动BLOCK当前处理的信号。
你将handler中的sleep去掉(信号处理程序中本来就不应该用sleep这类函数)。然后在子进程的for中加上sleep(1)