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

标签 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;
}

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

最佳答案

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

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

关于在 C 中关闭管道文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22032120/

相关文章:

c - 如何将链接目标添加到 Ruby mkmf?

c - 使用 char** 的项目(声明后初始化后)

bash - Redis:当通过 awk 传递 llen 结果时,谁在吃我的字段?

c - 使用编辑距离生成摘录

c - 了解管道、重定向和 IPC

c - 将 "blank"数据 block 分配给 .dat 文件的最简单方法

c - 使用管道将多个字符串发送到子进程

java - Perl 将 bash 管道发送到 Java

node.js - FFMPEG 挂掉整个nodejs进程

c - 在二维数组中找到最大的簇