在C中关闭管道文件描述符

时间:2014-02-26 04:56:30

标签: c pipe

以下是代码:

int main() {

    int fd[2];
    pipe(fd);
    int r = fork();
    if (r > 0) { //parent
        close(fd[0]);
        // do a bunch of things
    } else { //child
        close(fd[1]);
        // do a bunch of things
    return 0;
}

这是一段代码,其中父级写入管道,子级从管道读取。我的问题是:对于两个接近的陈述,它们到底是什么关闭的?父级和子级应共享相同的文件,即fd [0]和fd [1]。如果在父级中关闭了fd [0],那么它是否也应该在子级中关闭?

2 个答案:

答案 0 :(得分:3)

From http://linux.die.net/man/2/pipe pipe()创建一个由两个文件描述符组成的管道,这两个文件描述符对应于管道的两个“末端”,即读取端和写入端。它与文件不是一回事。内核正在从写端读取数据,为您缓冲数据,并将其传输到读取端。

这应该明确为什么pipe()创建两个文件描述符。编写器将所需的所有数据写入write fd并关闭fd。这也会触发EOF发送。读者通常会一直读取数据,直到遇到EOF并结束它。在这种情况下,有一段时间写入fd被关闭但数据仍然在管道中缓冲,等待读者读出。拥有一个单独的fd是没有意义的,因为你需要在编写器和读者进程之间进行另一层协调,否则谁将完成关闭,何时?

答案 1 :(得分:0)

pipe()调用总是返回一个整数数组,其中数组的第一个元素是从管道读取的读取描述符,第二个元素是写入管道的写入描述符。管道提供单向通信。如果在父级和子级中关闭fd [0],则无处可读取管道,反之,如果在无法写入管道的两个进程中关闭fd [1],那么我们关闭读取一个进程中的描述符,以便进程只能写入,而另一个进程将关闭写入描述符,这将使进程只能从管道中读取。