2

我有以下代码:

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 个字节。这正常吗?

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

4

1 回答 1

2

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

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

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

于 2014-05-26T21:01:11.040 回答