c - 为什么这段代码不能从管道中读取数据?

标签 c posix

我正在研究如何编写管道,并试图了解标准 c 库如何详细公开它们。我写了下面的代码,并期望输出是

2 3
MAJOR ERROR
BYE

但是第二行没有出现。有人可以解释为什么会这样吗?

int main()
{
    int rc;
    int p[2];
    char buffer[40];

    close(2);

    rc = pipe(p);
    printf("%d %d\n", p[0], p[1]);
    FILE* pipeWrite = fdopen(p[1], "w");
    fprintf(pipeWrite, "MAJOR ERROR\n");
    close(p[1]);

    rc = read(p[0], buffer, 40);
    buffer[rc] = '\0';
    printf("%s\n", buffer);
    printf("BYE\n");

    return 0;
}

谢谢。

最佳答案

您正在使用标准 IO 缓冲操作 (fprintf(3)) 写入管道,但随后在刷新输出之前关闭文件描述符。在 close(p[1]); 调用之前立即添加 fflush(pipeWrite); 并查看您的输出是否符合您的预期。 (您也可以使用 fclose(pipeWrite);,因为关闭标准 IO 流也会刷新输出。)

有关标准 IO 流缓冲选项的更多详细信息,请参阅 setvbuf(3) 联机帮助页。

关于c - 为什么这段代码不能从管道中读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5229337/

相关文章:

c - 在 C 中使用带有 ZBar 的 OpenCV 的问题

c - 使用 fscanf 和 sscanf 从文件读取格式化输入

regex - sed 正则表达式中的转义加号

linux - 这个命令 ls 的作用是什么。 | xargs -i -t cp ./{} $1

c - C 中的非忙阻塞队列实现

C 编程帮助 - 用户退出程序的选项

c - open() 的区别

c++ - 从没有 sprintf() 或模数的整数中提取数字

c - 正则表达式没有返回正确的解决方案

c - 为什么有些函数不涉及内核?