当前位置: 技术问答>linux和unix
(在线等)问个关于信号和进程的问题,有个程序哈!
来源: 互联网 发布时间:2016-10-09
本文导语: #include #include #include #include static int alarm_fired=0; void ding(int sig) { alarm_fired=1; } int main() { pid_t pid; pid=fork(); switch(pid) { case -1: ...
#include
#include
#include
#include
static int alarm_fired=0;
void ding(int sig)
{
alarm_fired=1;
}
int main()
{
pid_t pid;
pid=fork();
switch(pid)
{
case -1:
perror("fork failed");
exit(1);
case 0:
sleep(5);
kill(getppid(),SIGALRM);
exit(0);
}
printf("waiting for alarm to go off n");
(void)signal(SIGALRM,ding);
pause();
if(alarm_fired)
printf("ding!n");
printf("donen");
exit(0);
}
这是linux程序设计那本书的一个源程序,我有点搞不清楚为什么要在子进程中传递SIGALRM信号给父进程。父进程不是也在执行么?自己捕捉不到这个信号么????
|
演示父子进程之间的一种通信技术吧
父进程没有调用alarm,自己不会产生SIGALRM信号
父进程没有调用alarm,自己不会产生SIGALRM信号
|
sleep(5);// 子进程等待父进程设置好信号处理函数
kill(getppid(),SIGALRM);// 给父进程发信号;
signal(SIGALRM,ding);// 父进程注册信号处理函数
pause();//父进程休眠,等待一个信号的来临
|
我觉得这个例子不太好。也许作者只是为了简化案例,强调用kill()可以进行某种程度的IPC。但这个例子本身,我觉得没有这么用的,它仅是个伪造的场景,在实际项目中不会这么用。
不好的理由如下:
不能假设调度算法,因此父子进程在fork()后,那个首先执行是不知道的。
sleep(5),5秒钟的挂起,是为了保证父进程能够首先执行。然而,这只是经验上的保证。从原理上说,在一个非常忙碌的机器上,有很多的进程情况下,5秒内父进程没有执行怎么办?
那么,kill()首先被执行,而父进程还没有调用signal()准备好处理SIGALRM。信号首先丢失。子进程变成僵尸。
之后,父进程运行,永远挂起在pause()。
现实中的关于信号的程序通常都比这个复杂的多。会引入sigprocmask() sigpending()等一系列函数来处理。LZ请留意!