c - 即使写端关闭也从管道读取

标签 c unix pipe

我的老师说,如果管道的写入端关闭,子进程将无法再从管道的读取端读取,读取会产生 BROKEN _PIPE 错误。但是,在封闭管上阅读时,我无法让这段代码产生任何错误:

#include <stdio.h>
#include <unistd.h>
#include <wait.h>

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

    pipe(pipefd);

    if (fork() == 0) {
        close(pipefd[1]);
        sleep(5);
        // The parent has already closed pipefd[1]
        while (read(pipefd[0], &c, 1)) {
            printf("%c", c);
        }
        close(pipefd[0]);
        return 0;
    }

    close(pipefd[0]);

    char str[] = "foo";
    write(pipefd[1], str, 4);

    close(pipefd[1]);

    return 0;
}

5 秒后 stdout 上的输出是 foo。所以我的理解是,关闭写端只是在已经存在的字符之后添加 EOF,并且不会在任何即将到来的读取中发送 EOF(这样 child 就可以读取所有已经发送的字符)。我说得对吗?

最佳答案

正如你所发现的,你的老师错了。

当您尝试从破损的管道读取,但是当您尝试写入到破损的管道时。

对于 Linux 系统,您可以阅读更多相关信息 here ,或者您可以查看 BSD 手册页 pipe(2) .

关于c - 即使写端关闭也从管道读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52522006/

相关文章:

c - inline 关键字导致 Clion 中的链接器错误

linux - 接受用户名作为命令行参数并仅显示该用户帐户信息的脚本是什么?

c - 我错误地使用了 close() 吗?

unix - 如何 grep 查找以破折号/连字符开头的字符串?

linux - 如果文件存在,输出在 shell 中重定向到另一个文件

python - 从 python 解释器内部创建管道

c - C中的管道/FIFO清除

c++ - 如何将此代码转换为 C++?

跨平台系统截图

c - 从文件中获取行,放入结构数组,打印内容(作业)