fread功能是否阻塞?

时间:2014-05-26 20:29:13

标签: c++ pipe nonblocking fdopen

我有以下代码:

int buffer_max_size = 1024;
char* buffer = new char[buffer_max_size]
FILE* cout_file = fdopen(cout_pipe[0], "r");
while (fread( &buffer[0], sizeof(char),sizeof(char)*buffer_max_size, cout_file) != 0 )
{...}

cout_file的类型为FILE *,并连接到二进制文件的标准输出。  该二进制文件以5秒的间隔在其std_out上输出一些文本。

似乎fread一直阻塞,直到cout_file包含buffer_max_size字节..这是正常的吗?

我希望能够在不阻塞的情况下立即读取管道中的内容。这可能吗?

1 个答案:

答案 0 :(得分:2)

如果您想要非阻塞I / O,请使用操作系统的readfcntl功能。

<stdio.h> API(以及<fstream>)执行额外的缓冲,并且可以自动重试早期结束的读取(例如由于被信号中断),因此无法保证提供非即使为其配置了底层文件描述符,也会阻塞I / O.

并非所有操作系统都会使用这些POSIX名称。在这种情况下,您的选项是特定于平台的代码(例如,在Windows上,您将使用ReadFileSetNamedPipeHandleState),或使用包装库(如Boost ASIO)来抽象差异。但请确保您的包装器设计为暴露非阻塞行为,否则会导致与<stdio.h>

相同的痛苦