snow_cool301 2017-08-08 08:38 采纳率: 0%
浏览 695

关于SIGCHLD的一点疑问

下面这段程序:
void sig_handler(int sig)
{
switch(sig){
case SIGPIPE:
printf("Get SIGPIPE signal:reader does not exist\n");
case SIGCHLD:
printf("Get SIGCHLD signal:child exits\n");
}
}
int main()
{
pid_t pid;
char data[32] = "hello";
int fds[2];
signal(SIGCHLD,sig_handler);//设置当前进程对对SIGCHLD信号捕捉函数
if(pipe(fds) == 0){

    pid = fork(); 
    if(pid == 0){
    printf("Child is waiting 2s for closing pipereadend of parent\n");
    sleep(2);
    close(fds[0]);//关闭子进程管道读端
        signal(SIGCHLD,SIG_DFL);//设置子进程对SIGCHLD信号默认处理方式
        signal(SIGPIPE,sig_handler);//设置子进程对SIGPIPE信号捕捉函数
        write(fds[1],data,strlen(data));//子进程写data进入管道

    }else if(pid > 0){
    close(fds[0]);//关闭父进程管道读端
        wait(NULL);
        }
}
return 0;

}

执行结果为
Child is waiting 2s for closing pipereadend of parent
Get SIGPIPE signal:reader does not exist
Get SIGCHLD signal:child exits
Get SIGCHLD signal:child exits

我的疑问是为什么这个程序里子进程会给父进程发两次SIGCHLD信号?触法执行了两次_sig_handler函数. SIGCHLD信号不是应该子进程结束终止时才给父进程发吗?那这个地方另外一次是什么时候发的?难道是子进程收到SIGPIPE信号执行了函数后就终止了?_

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2018-06-14 16:40
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog