将 TEE 与 C 程序的连续输出一起使用



它一定很简单,但我无法抓住它。

这是一个写给stdout的琐碎的C程序:

root@oceanLondon:~/tst# cat tst.c
#include <stdio.h>
#include <unistd.h>
int
main(int argc, char **argv)
{
        for (; ;) {
                printf("Hello world!n");
                sleep(1);
        }
        return 0;
}

现在,如果我想将输出写入我的屏幕和文件:

root@oceanLondon:~/tst# ./tst |tee file

它只是不起作用,我有空屏幕和空文件。

如果我做一个退出的程序,那么它可以完美地工作,例如

root@oceanLondon:~/tst# ls |tee file
Makefile
file
qq
tst
tst.c
tst.o
root@oceanLondon:~/tst# cat file
Makefile
file
qq
tst
tst.c
tst.o
root@oceanLondon:~/tst#

是某种缓冲问题吗?有人可以帮我在继续节目中做发球吗?

如果可以确定标准输出流引用交互式设备(例如终端),则标准输出流是行缓冲的,否则它是完全缓冲的,因此,在某些情况下,即使printf有换行符要打印,即使它有一个换行符要打印,如管道或重定向输出;

> tst | tee file
> tst > file

printf()后呼叫fflush(stdout)将解决问题。

C997.19.3的相关文本指出;

当流未缓冲时,字符应从 尽快到达源头或目的地。否则 字符可以累积并传输到主机或从主机传输 环境作为块。

当流完全缓冲时,字符应 当缓冲区作为块传输到主机环境或从主机环境传输时 已填充。

当流被行缓冲时,字符应 换行时作为块传输到主机环境或从主机环境传输 遇到角色。

最初打开时,标准错误流未完全缓冲; 标准输入和标准输出流完全缓冲,如果 并且仅当可以确定流不引用 交互式设备。

似乎您的问题是stdout被缓冲并且没有显示在新行之后。您可以通过在 printf 语句后刷新它来强制显示它:

fflush(stdout); 

或者,您可以使用以下命令禁用缓冲:

setbuf(stdout, NULL);

另外,请注意,stderr未缓冲,您可以通过打印到 stderr 而不是 stdout 来检查问题是否是缓冲问题。

正如您所注意到的,您也可以使用stdbuf(此答案的更多信息)。

最新更新