Fread 功能是否阻塞?

Is the fread function blocking?

提问人:Kam 提问时间:5/27/2014 最后编辑:Daniel HeilperKam 更新时间:5/27/2014 访问量:5562

问:

我有以下代码:

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*,并连接到二进制文件的 stdout。 该二进制文件以 5 秒的间隔在其std_out上输出一些文本。

似乎 fread 正在阻塞,直到cout_file包含 buffer_max_size 个字节。这正常吗?

我希望现在能够毫无阻塞地读取管道中的内容。.这可能吗?

FDopen C++ 管道 非阻塞

评论

1赞 user1095108 5/27/2014
除非将其设置为非阻塞,否则它会阻塞。
0赞 Kam 5/27/2014
如何将其设置为非阻塞?
0赞 πάντα ῥεῖ 5/27/2014
“胎面功能阻塞了吗?”这取决于底层设备句柄,以及您可能如何打开它......您可能还对 poll() 实际提供的内容感兴趣。
0赞 Jose Palma 5/27/2014
谷歌一下:stackoverflow.com/questions/914463/...

答:

2赞 Ben Voigt 5/27/2014 #1

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

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

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