Почему строка stdbuf не буферизирует вывод некоторых простых программ на c - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь использовать stdbuf для выравнивания буфера вывода программы, но я не могу заставить его работать так, как я ожидал. Используя этот код:

#include <stdio.h>
#include <unistd.h>

int main (void)
{
    int i=0;
    for(i=0; i<10; i++)
    {
        printf("This is part one");
        fflush(stdout);
        sleep(1);
        printf(" and this is part two\n");
    }
    return 0;
}

Я вижу This is part one, одна секунда ожидания, затем and this is part two\nThis is part one.

Я ожидал, что запустив его как

stdbuf --output=L ./test.out

приведет к задержке на 1 секунду, а затем This is part one and this is part two\n будет повторяться с интервалом в одну секунду. Вместо этого я вижу тот же вывод, что и в случае, когда я не использую stdbuf. * ​​1012 *

Неправильно ли я использую stdbuf или вызов fflush считает "настройкой" буферизации, как описано на странице справки sdtbuf ?

Если я не могу использовать stdbuf для линейного буфера таким образом, есть ли другой инструмент командной строки, который делает это возможным?

1 Ответ

1 голос
/ 02 апреля 2019

Вот несколько вариантов, которые работают для меня, учитывая пример кода, и работают в интерактивном режиме (вывод был в псевдо-TTY):

./program | grep ^
./program | while IFS= read -r line; do printf "%s\n" "$line"; done

В нескольких быстрых тестах обавыводить полную строку за раз.Если вам нужно продвинуться дальше, опция grep --line-buffered будет полезна.

...