如何与父母沟通那个孩子关闭写管道的结尾?

时间:2017-02-03 23:19:36

标签: linux pipe fork

当管道的写入端关闭时,管道上的

read返回0:

#include <unistd.h>

int main() {
    int pipefd[2];
    char c;

    pipe(pipefd);
    close(pipefd[1]);
    read(pipefd[0], &c, 1);
}

在上面的代码中,read返回。但如果我们分叉孩子,这不起作用:

#include <unistd.h>

int main() {
    int pipefd[2];
    char c;

    pipe(pipefd);

    if (fork())
        read(pipefd[0], &c, 1);
    else
        close(pipefd[1]);
}

此处close成功,但read挂起。孩子已经关闭的最佳沟通方式是什么,所以父母的read会返回(0)?

1 个答案:

答案 0 :(得分:2)

父和子都有管道的读写端。因为仍有一个打开的写入结束,所以读取不能返回EOF。

如果您不打算写入管道,则修复是关闭管道的写入端,如果您不打算从管道读取,则关闭管道的读取端,例如< / p>

if (fork()) {
    close(pipefd[1]);
    read(pipefd[0], &c, 1);  /* == 0 */
} else {
    close(pipefd[0]);
    close(pipefd[1]);
}