fread()基于管道设置错误从描述符读取,而不是没有数据的EOF

3 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;
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*t F 8

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

  • errno==EAGAIN 当那里根​​本没有任何东西可以阅读时(现在没有任何意义,但可能是以后的东西 - 稍后再尝试(e)).
  • EOF 当管道的写入侧关闭时(意味着不再有数据出现).

有关在read()设置O_NONBLOCK模式时read()的行为,请参见联机帮助页. fread()行为应与read()一致.