当前位置: 技术问答>linux和unix
为什么子进程结束的时候父进程没有收到SIGCHLD?
来源: 互联网 发布时间:2017-04-18
本文导语: 如下的小程序 #include #include #include #include void f(int sno){ printf("%dn"); } int main(void){ signal(SIGCHLD,f); pid_t pid=fork(); if(pid==0)//child { printf("child,parant=%dn",getppid()); }else{//parent printf("me=%d,child=%dn",getpid(),pid); } return 0; ...
如下的小程序
执行的结果是:
# g++ sc.cpp && ./a.out
me=16212,child=16213
child,parant=16212
看起来我的signal函数注册的f函数,并没有执行啊。不是说子进程退出的时候父进程就会收到SIGCHLD么?
#include
#include
#include
#include
void f(int sno){
printf("%dn");
}
int main(void){
signal(SIGCHLD,f);
pid_t pid=fork();
if(pid==0)//child
{
printf("child,parant=%dn",getppid());
}else{//parent
printf("me=%d,child=%dn",getpid(),pid);
}
return 0;
}
执行的结果是:
# g++ sc.cpp && ./a.out
me=16212,child=16213
child,parant=16212
看起来我的signal函数注册的f函数,并没有执行啊。不是说子进程退出的时候父进程就会收到SIGCHLD么?
|
那是因为父进程已经推出了。
设置父进程睡眠1s钟,就可以看到我们期待的结果了:
[code]
#include
#include
#include
#include
void f(int sno){
printf("%dn",sno);
}
int main(void){
signal(SIGCHLD,f);
pid_t pid=fork();
if(pid==0)//child
{
printf("child,parant=%dn",getppid());
}else{//parent
printf("me=%d,child=%dn",getpid(),pid);
sleep(1); // -- ç¶äº²è¿éå 个sleepãä½ çé®é¢åºç°å¨ç¶äº²å æ¯å©åéåºäºã
}
return 0;
}
[/code]
设置父进程睡眠1s钟,就可以看到我们期待的结果了:
[code]
#include
#include
#include
#include
void f(int sno){
printf("%dn",sno);
}
int main(void){
signal(SIGCHLD,f);
pid_t pid=fork();
if(pid==0)//child
{
printf("child,parant=%dn",getppid());
}else{//parent
printf("me=%d,child=%dn",getpid(),pid);
sleep(1); // -- ç¶äº²è¿éå 个sleepãä½ çé®é¢åºç°å¨ç¶äº²å æ¯å©åéåºäºã
}
return 0;
}
[/code]