pppadr 发表于 2013-07-23 09:39

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

本帖最后由 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;
}

_lele 发表于 2013-07-30 08:02

你这里是在子进程退出之前,父进程已经退出了!将父进程sleep一下吧!但并不是在子进程退出时总会产生SIGCHLD的,当然你这里是会产生的,在使用sigaction安装信号是如果sa_flags 设置为SA_NOCLDSTOP 那么子进程退出是不会产生SIGCHLD信号。
页: [1]
查看完整版本: 为什么子进程结束的时候父进程没有收到SIGCHLD?