![](/img/trans.png)
[英]Execution of a function form child process after receiving a SIGUSR1 signal
[英]Child process still does not run after receiving signal
该代码是对此问题的答案之一。
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void
sigusr1( int pidno )
{
fprintf(stderr, "Caught\n");
}
int
main()
{
pid_t pid;
signal( SIGINT, sigusr1 );
if( (pid = fork()) == 0 ){
pause();
fprintf(stderr, "Child\n");
}
else
{
fprintf(stderr, "Parent\n");
kill( pid , SIGINT ); //parent sends signal to child
}
pause();
return 0;
}
子进程等待信号,并在接收到信号后继续执行。
运行它我得到
Parent
Caught
似乎孩子在收到信号后没有跑动。 按Ctrl + c:
Parent
Caught
^CCaught
Caught
Child
有人可以解释一下这里发生了什么吗?
子级收到并处理信号后 ,将调用pause()。 不幸的是, pause()容易引入这种竞争条件 :
time you parent child
---- --- ------ -----
0 signal(SIGINT,handler)
1 fork() (hello)
2 print("Parent") (waking up)
3 kill(..., SIGINT) <<SIGINT>> # RACE kill v pause
4 handler: print("Caught")
5 pause() pause()
6 ^C <<SIGINT>> <<SIGINT>>
7 handler: print("Caught") handler: print("Caught")
8 exit pause()
9 (still running)
要检查到底发生了什么,请尝试将%i,getpid()添加到printfs,还可能在子分支中的pause()调用之前再添加一个printf()。
sigsuspend()和显式信号屏蔽可能是一个更好的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.