使stdout和stderr由同一个缓冲区缓冲

使stdout和stderr由同一个缓冲区缓冲

stdout是否可以强制 glibc 对和使用相同的缓冲区stderr

如果我tee两个输出:

./tests/tests 2>&1 | tee log

我收到混合消息(即消息在内部排序stdoutstderr但彼此之间不排序)。我可以关闭缓冲:

stdbuf -i0 -o0 -e0 ./tests/tests 2>&1 | tee log

但这会导致速度大幅下降(我正在推送数百MB的日志)。是否可以有缓冲但在stdout和之间共享stderr? FD12指向相同的输出(如示例中所示)。

答案1

我不完全确定在什么情况下你想要使缓冲区相同,但在 C 程序中,作者可以使用setbuf()库函数系列来给出相同的stderr缓冲区stdout

只是使用 shell 来调用其他程序,我认为您不能这样做,因为函数系列暗示的原因:和setbuf的实现都有一个每个实例的内存(缓冲区)。如果程序没有以特定方式编写,即未将缓冲区设置为和的同一块内存,那么 shell 无法使程序执行常见的缓冲。FILE *stderrFILE *stdoutstdoutstderr

相关内容