为什么子进程结束的时候父进程没有收到SIGCHLD?
如下的小程序#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
void f(int sno){
printf("%d\n");
}
int main(void){
signal(SIGCHLD,f);
pid_t pid=fork();
if(pid==0)//child
{
printf("child,parant=%d\n",getppid());
}else{//parent
printf("me=%d,child=%d\n",getpid(),pid);
}
return 0;
}
执行的结果是:
# g++ sc.cpp && ./a.out
me=16212,child=16213
child,parant=16212
看起来我的signal函数注册的f函数,并没有执行啊。不是说子进程退出的时候父进程就会收到SIGCHLD么?
本帖最后由 cxytz01 于 2013-07-23 10:21 编辑
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
void f(int sno){
printf("%d\n");
}
int main(void){
signal(SIGCHLD,f);
pid_t pid=fork();
if(pid==0)//child
{
printf("child,parant=%d\n",getppid());
}else{//parent
printf("me=%d,child=%d\n",getpid(),pid);
sleep(1); -- 父亲这里加个sleep。你的问题出现在父亲先比孩子退出了。
}
return 0;
} 你这里是在子进程退出之前,父进程已经退出了!将父进程sleep一下吧!但并不是在子进程退出时总会产生SIGCHLD的,当然你这里是会产生的,在使用sigaction安装信号是如果sa_flags 设置为SA_NOCLDSTOP 那么子进程退出是不会产生SIGCHLD信号。
页:
[1]