管道,当父母关闭fd [1]时,孩子将从fd [0]获得什么?

时间:2015-07-29 04:07:20

标签: c linux pipe

#define STACK_SIZE (1024 * 1024)

static char container_stack[STACK_SIZE];
char* const container_args[] = {
    "/bin/bash",
    NULL
};

int pipefd[2];

...

int container_main(void* arg)
{

    ...

    char ch;
    close(pipefd[1]);
    read(pipefd[0], &ch, 1);

    printf("Get EOF [%d] from parent!\n", ch);

    ...

    execv(container_args[0], container_args);
    printf("Something's wrong!\n");
    return 1;
}

int main()
{
    ...

    pipe(pipefd);

    printf("Parent [%5d] - start a container!\n", getpid());

    int container_pid = clone(container_main, container_stack+STACK_SIZE, 
            CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWUSER | SIGCHLD, NULL);


    ...

    close(pipefd[1]);

    ...
    return 0;
}

所以,在父进程中,我close(pipefd[1]);,如果我从孩子的read(pipefd[0], &ch, 1);读取,我将继续在子进程中工作。这是有道理的。

但是当我打印ch的值时,它是0,我认为它应该是-1,这意味着EOF。

所以有人可以告诉我为什么我从孩子而不是EOF读取fd [0]中的0

1 个答案:

答案 0 :(得分:1)

read()0上返回EOF ...它会返回-1以查找错误,因此如果管道的另一端已关闭,您希望read返回{ {1}}并且根本不修改ch。

这是我的错误,我希望将EOF打印到0,但-1已经处理read()并返回EOF

感谢Dmitri& William Pursell