Функция Fread блокируется?

У меня есть следующий код:

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 * и подключен к стандартному выводу двоичного файла.
Этот двоичный файл выводит некоторый текст на свой std_out с интервалами в 5 секунд.

Кажется, что fread блокируется, пока cout_file не содержит байтов buffer_max_size. Это нормально?

Я хотел бы иметь возможность читать то, что находится в трубе прямо сейчас без блокировки .. Это возможно?

1

Решение

Если вы хотите неблокирующий ввод / вывод, используйте ОС read а также fcntl функции.

<stdio.h> API (а также <fstream>) выполняет дополнительную буферизацию и может автоматически повторять попытки чтения, которые заканчиваются досрочно (например, из-за прерывания сигналом), поэтому нельзя гарантировать, что они обеспечат неблокирующий ввод / вывод, даже если для него настроен базовый файловый дескриптор.

Не все ОС будут использовать эти имена POSIX. В этом случае ваши параметры зависят от платформы (например, в Windows вы будете использовать ReadFile а также SetNamedPipeHandleState) или использование библиотеки-оболочки, такой как Boost ASIO, для абстрагирования отличий. Но убедитесь, что ваша обертка предназначена для демонстрации неблокирующего поведения, иначе это вызовет ту же боль, что и <stdio.h>

2

Другие решения