我需要用 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/