Раніше це було, і, мабуть, все ще так, що коли стандартний вихід записується в термінал, він буферизується за замовчуванням - коли пишеться новий рядок, рядок записується до терміналу. Коли стандартний вихід надсилається в трубу, він повністю буферизується - тому дані надсилаються до наступного процесу в трубопроводі, коли заповнений стандартний буфер вводу / виводу.
Оце джерело неприємностей. Я не впевнений, чи можна багато зробити, щоб виправити це, не змінюючи запис програми в трубу. Ви можете використовувати setvbuf()
функцію з _IOLBF
прапором, щоб беззастережно перевести stdout
в режим буферизації рядків. Але я не бачу простий спосіб застосувати це в програмі. Або програма може робити fflush()
у відповідних точках (після кожного рядка виводу), але застосовується той самий коментар.
Я припускаю, що якщо ви замінили трубу на псевдотермінал, то стандартна бібліотека вводу / виводу подумала б, що вихід є терміналом (оскільки це тип терміналу) і буде автоматично буферувати рядок. Але це складний спосіб поводження з речами.