Чтение дочернего процесса, как только некоторые из них доступны?

Я пытаюсь использовать различные методы (popen, pipes + fork / exec, …) для чтения вывода дочернего процесса, все из которых работают, но демонстрируют одно и то же поведение: всякий раз, когда я пытаюсь прочитать вывод, используя read / fread , он возвращается только при полном заполнении буфера или при выходе из него. Я ищу поведение, которое больше похоже на поведение сокетов: чтение любого количества данных, как только некоторые из них доступны.

Как я могу это сделать?

Как правило, вы этого не делаете. В частности, дочерний процесс будет буферизовать stream, потому что он не увидит stream, подключенный к трубе, как «интерактивный». Поскольку буферизация происходит внутри дочернего процесса, единственный способ предотвратить это – переписать код в дочернем элементе, чтобы предотвратить его буферизацию его стандартного вывода (либо когда-либо, либо когда он передавался определенным коммутатором, либо, возможно, вы можете добавить код чтобы обнаружить, когда он подключен к трубе и отключить буферизацию только в этом конкретном случае). Это, однако, может повлиять на производительность ребенка, если он много пишет для стандартного вывода (особенно если вы не выбираете, когда вы отключите буферизацию).

Я не думаю, что это возможно. Буферизация обрабатывается на стороне ребенка, и если она не очищает буферы, вам нечего читать. Однако несколько инструментов имеют параметры командной строки для управления буферизацией, например grep --line-buffered .