提问人:Kam 提问时间:5/27/2014 最后编辑:Daniel HeilperKam 更新时间:5/27/2014 访问量:5562
Fread 功能是否阻塞?
Is the fread function blocking?
问:
我有以下代码:
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 个字节。这正常吗?
我希望现在能够毫无阻塞地读取管道中的内容。.这可能吗?
答:
2赞
Ben Voigt
5/27/2014
#1
如果您想要无阻塞 I/O,请使用操作系统和功能。read
fcntl
API(以及 )执行额外的缓冲,并可能自动重试提前结束的读取(例如,由于被信号中断),因此即使为其配置了底层文件描述符,也无法保证它们提供非阻塞 I/O。<stdio.h>
<fstream>
并非所有操作系统都使用这些 POSIX 名称。在这种情况下,你的选项是特定于平台的代码(例如,在 Windows 上,你将使用 SetNamedPipeHandleState
),或者使用包装库(如 Boost ASIO)来抽象差异。但请确保您的包装器被设计为公开非阻塞行为,否则它会导致与ReadFile
<stdio.h>
上一个:调用 fgets() 两次
下一个:从文件读取日期到链表
评论
poll()
实际提供的内容感兴趣。