Раньше так и было, и, вероятно, так и есть, когда стандартный вывод записывается в терминал, он по умолчанию буферизует строку - когда пишется новая строка, строка записывается в терминал. Когда стандартный вывод отправляется в канал, он полностью буферизуется, поэтому данные отправляются следующему процессу в конвейере только после заполнения стандартного буфера ввода / вывода.
Это источник неприятностей. Я не уверен, есть ли что-то, что вы можете сделать, чтобы исправить это, не изменяя запись программы в трубу. Вы можете использовать setvbuf()
функцию с _IOLBF
флагом, чтобы безоговорочно перевести ее stdout
в режим буферизации строки. Но я не вижу простого способа применить это в программе. Или программа может делать fflush()
в соответствующих точках (после каждой строки вывода), но тот же комментарий применяется.
Я предполагаю, что если вы замените канал псевдотерминалом, то стандартная библиотека ввода / вывода будет думать, что вывод является терминалом (потому что это тип терминала) и будет автоматически выполнять линейный буфер. Хотя это сложный способ иметь дело с вещами.