Многие многие библиотеки времени выполнения (например, я знаю, что libc делает это, и не удивлюсь, если другие тоже сделают это) будут буферизовать свои выходные данные по умолчанию за исключением , когда выходные данные поступают на терминал , Это чрезвычайно увеличивает эффективность обработки данных при работе со многими линиями (например, в обычном конвейере), но когда имеется только небольшое количество информации, это очень больно. Если у вас есть доступ к источнику подпроцесса, определенно лучше обновить код, отключив буферизацию или добавив сбросы.
Но это не всегда возможно, особенно когда речь идет о стороннем коде. Лучшее прочее исправление, которое я знаю в этом случае, заключается в использовании инструмента типа Expect для обмана подпроцесса. Внутренне, Expect знает, как притвориться терминалом (используя ptys в Unix и безбожные хаки в Windows), таким образом обманывая другие программы, отключая (или, по крайней мере, уменьшая) их буферизацию. Существует сценарий - unbuffer - для Expect, который фокусирует его именно на такого рода использовании. (В целом, это может сделать гораздо больше, чем просто справиться с непослушной буферизацией, но в любом случае это лучшее исправление.)