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

为什么子进程结束的时候父进程没有收到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么?

------解决方案--------------------
那是因为父进程已经推出了。
设置父进程睡眠1s钟,就可以看到我们期待的结果了:
[code]
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
void f(int sno){
        printf("%d\n",sno);
}

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); //                                                                -- ????o2è??é???????asleep?????????é??é¢???o??°??¨????o2????ˉ??-??-?é????o?o????
    }

    return 0;
}
[/code]