为什么stdbuf行不缓冲一些简单的c程序的输出

Why doesn't stdbuf line buffer the output of some simple c programs

我正在尝试使用 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 时的输出相同。

我是否错误地使用了 stdbuf 或对 fflush 的调用算作 "adjusting" sdtbuf man page 中描述的缓冲?

如果我不能以这种方式使用 stdbuf 来排列缓冲区,是否有另一个命令行工具可以实现?

这里有几个对我有用的选项,给定示例代码,运行 交互(输出到伪 TTY):

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

在几个快速测试中,两者都一次输出完整的一行。如果您需要进一步管道化,grep--line-buffered 选项应该很有用。