3

我需要用 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;
}
4

1 回答 1

8

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

  • errno==EAGAIN当根本没有任何东西可以阅读时(现在什么都没有,但也许以后有什么意义 - 稍后再试(e))。
  • EOF当管道的写入端关闭时(意味着没有更多数据到来)。

read()有关设置 O_NONBLOCK 模式时 read() 的行为方式, 请参见手册页。fread()行为应该与 read() 一致。

于 2010-12-07T14:08:29.050 回答