У меня есть следующий код:
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. Это нормально?
Я хотел бы иметь возможность читать то, что находится в трубе прямо сейчас без блокировки .. Это возможно?
Если вы хотите неблокирующий ввод / вывод, используйте ОС read
а также fcntl
функции.
<stdio.h>
API (а также <fstream>
) выполняет дополнительную буферизацию и может автоматически повторять попытки чтения, которые заканчиваются досрочно (например, из-за прерывания сигналом), поэтому нельзя гарантировать, что они обеспечат неблокирующий ввод / вывод, даже если для него настроен базовый файловый дескриптор.
Не все ОС будут использовать эти имена POSIX. В этом случае ваши параметры зависят от платформы (например, в Windows вы будете использовать ReadFile
а также SetNamedPipeHandleState
) или использование библиотеки-оболочки, такой как Boost ASIO, для абстрагирования отличий. Но убедитесь, что ваша обертка предназначена для демонстрации неблокирующего поведения, иначе это вызовет ту же боль, что и <stdio.h>