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

Xuf*_*eng 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

con*_*gus 6

来自http://linux.die.net/man/2/pipe pipe()创建一个由两个文件描述符组成的管道,这两个文件描述符对应于管道的两个“端”,即读取端和写入端。它实际上与文件不同。内核从写端读取数据,为您缓冲,然后将其传输到读端。

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

  • 两个进程都有不同的文件描述符表,因此当您关闭一个进程中的描述符时,它将从相应的文件描述符表中删除。 (3认同)