我有一个C程序,它将一些信息输出到控制台,然后进入无限循环。我需要在后台运行程序并将输出重定向到日志文件。如果程序没有无限循环,则重定向有效,如果程序具有无限循环,则不会写入任何内容。
例如,此程序 test.c :
#include <stdio.h>
main (void) {
printf("Hello world\n");
while(1);
}
如果我运行它,我会在控制台上看到 Hello world 行,但如果我运行 ./ test&gt; logfile 我没有在文件上写任何东西。
有没有办法让这个工作?
谢谢!
答案 0 :(得分:2)
欢迎来到缓冲输入/输出的世界。
使用非缓冲的系统调用(open
,read
,write
)或刷新流。
编辑:此外,它可能是文件系统问题。在文件系统上执行 sync
。
答案 1 :(得分:1)
输出位于进程内的内存缓冲区中。
如果没有无限循环,则在进程退出之前,通过C库中的代码刷新缓冲区。
修复它的一种简单方法是插入:
setlinebuf(stdout);
在程序开始时:然后每行将在写完后刷新。 (参见man setbuf(3)
。)在进入无限循环之前你也可以fflush()
,但是如果你希望这个程序能够输出,在计算之间,只需要修复缓冲一次比记住更简单每次冲洗。
C在写入终端时默认为行缓冲,但在写入文件时默认为较大的缓冲区,这就是没有重定向就看不到的原因。
答案 2 :(得分:0)
试试这个:
#include <stdio.h>
main (void) {
printf("Hello world\n");
fflush(stdout); // <--
while(1);
}
对于输出流,fflush()
强制通过流的底层写入函数为给定输出或更新流写入所有用户空间缓冲数据。