只有一个孙子被杀,而不是5个

时间:2016-01-19 22:01:42

标签: c linux operating-system embedded

这是我前一个问题的从头开始编写的。我真正需要实现的是:将来工作能够关闭管道的一端,以便孙子(守护程序)接收 SIGPIPE 即可。当我使用1个解决方案时,它就像一个魅力(但这是在任何分叉之前)。当我使用2个解决方案时,只有一个写生成SIGPIPE。我该如何检查?通过发出:strace -f ./a.out 2>& 1 | grep PIPE

#include <sys/wait.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

void child_become_daemon( int pfd[][2], int id )
{
    int pid = fork();
    if( pid == 0 )
    {
        dup2( pfd[id][1], 1 );
        close( pfd[id][0] );
        sleep( 5 ); //this is to be sure that opposite end is already closed
        write( 1, "child", strlen( "child" ) );
    }
    if( pid > 0 )
    {
        exit( 0 );
    }
}

int main()
{
    int pid;
    int numKids = 5;
    int procNum;

    int pfd[numKids][2];
    for( int i = 0; i < numKids; ++i )
    {
        pipe( pfd[ i ] );
        //close( pfd[i][0] );//1 all killed - perfect
    }

    for( procNum = 0; procNum < numKids; procNum++ ) {
        pid = fork();
        if( pid == 0 ) {
            break;
        }
    }

    if( pid == 0 ) {
        printf( "I'm child %d\n", procNum );
        child_become_daemon( pfd, procNum );
    }
    else {
        for( int i = 0; i < numKids; ++i )
        {
            printf( "closing %d\n", i );
            close( pfd[i][0] );//2 why only one will get killed
            close( pfd[i][1] );
        }

        char buf[124] = { 0 };
        for( int i = 0; i < numKids; ++i )
        {
            read( pfd[i][0], buf, 124 );
            printf( "buf: %s\n", buf );
        }

         int p, status;
         while ((p = wait(&status)) != -1)
             fprintf(stderr, "p %d exits with %d\n", p, WEXITSTATUS(status));
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

孙子继承了所有5个管道,因此每个管道都有其他4个管道可供读取,因此没有SIGPIPE。如果有一个“不幸”的时间,最后一个活着可能会得到一个SIGPIPE,因为其余的都没有了。

[编辑] 你也无法真正了解,因为如果他们的父母已经去世,你就不能等待孙子进程。并且你没有在孙子孙女中捕捉到SIGPIPE。