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/

相关文章:

我们可以在 getopt 中添加更多选项吗?

c++ - <system_error> 类别和标准/系统错误代码

c++ - Posix 是否为 printf/scanf 提供格式字符串宏?

比较数字排序然后得到中值

c - 没有线程的全局变量

c++ - CUrl(MSVS 库)还是 libcurl?

c - 帮助 :wrong behavior code:client-server IPC signal handling on POSIX Message Queue UNIX C programming

c++ - 在x86_64模式下,寄存器中无法容纳64位数字

c - 使用 libcurl 在 C 中进行 JSON 请求

linux - clock_gettime 是 UTC 时间还是本地时区?