c - fread() 根据管道集错误从描述符读取,而不是没有数据的 EOF

标签 c unix pipe fread

我需要用 fread() 从管道的读取端读取内容。

但是当我希望 fread() 在管道中没有任何内容时设置 EOF,它却设置了错误指示器。我检查了 posix 和 C 标准,但没有发现任何线索。可能我在做一些意想不到的事情(阅读,愚蠢),对吧:)

摘录如下:

#include <stdio.h>
#include <fcntl.h>

int main()
{
   char buf[128];
   FILE *f;
   int pipe_fd[2], n;

   pipe(pipe_fd);
   fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK);

   f=fdopen(pipe_fd[0], "r");
   n=fread(buf, 1, 1, f);
   printf("read: %d, Error: %d, EOF: %d\n", n, ferror(f), feof(f));

   return 0;
}

最佳答案

由于您使用的是非阻塞管道,我相信您会得到:

  • errno==EAGAIN 当根本没有任何东西可读时(意味着现在什么都没有,但可能稍后再试 - 稍后再试一次)。
  • EOF 当管道的写入端关闭时(意味着没有更多数据传入)。

请参阅 read() 的联机帮助页,了解设置 O_NONBLOCK 模式时 read() 的行为方式。 fread() 行为应该与 read() 一致。

关于c - fread() 根据管道集错误从描述符读取,而不是没有数据的 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4377210/

相关文章:

linux - 取消设置参数变量

c++ - 使 Web 服务器与客户端断开连接?

C 程序模拟命令行提示符

c++ - 优化器和专用于 what 命令的字符串之间的交互

c - 如何获取此代码中的 Days 值?

arrays - 无法将函数参数分配给 `Zsh` 中的局部数组变量

c - C 中管道的两种方式进程通信

C 在我编写的程序中正确使用 malloc 和 free

c - 多个格式说明符的 printf 对齐

go - 我如何从向 stdout 发出错误的一系列 exec 命令中获取错误消息