它一定很简单,但我无法抓住它。
这是一个写给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)
将解决问题。
C99
节7.19.3
的相关文本指出;
当流未缓冲时,字符应从 尽快到达源头或目的地。否则 字符可以累积并传输到主机或从主机传输 环境作为块。
当流完全缓冲时,字符应 当缓冲区作为块传输到主机环境或从主机环境传输时 已填充。
当流被行缓冲时,字符应 换行时作为块传输到主机环境或从主机环境传输 遇到角色。
最初打开时,标准错误流未完全缓冲; 标准输入和标准输出流完全缓冲,如果 并且仅当可以确定流不引用 交互式设备。
似乎您的问题是stdout
被缓冲并且没有显示在新行之后。您可以通过在 printf 语句后刷新它来强制显示它:
fflush(stdout);
或者,您可以使用以下命令禁用缓冲:
setbuf(stdout, NULL);
另外,请注意,stderr
未缓冲,您可以通过打印到 stderr
而不是 stdout
来检查问题是否是缓冲问题。
正如您所注意到的,您也可以使用stdbuf
(此答案的更多信息)。