0

我有一个 C 程序,它向控制台输出一些信息,然后进入无限循环。我需要在后台运行程序并将输出重定向到日志文件。如果程序没有无限循环,则重定向有效,如果程序有无限循环,则什么也不写。

例如,这个程序test.c

#include <stdio.h>
main (void) {
printf("Hello world\n");
while(1);
}

如果我运行它,我会在控制台上看到Hello world行,但如果我运行./test > logfile,我不会在文件上写任何内容。

有什么办法可以做到这一点吗?

谢谢!

4

3 回答 3

2

欢迎来到缓冲输入/输出的世界。

使用非缓冲系统调用 ( open, read, write) 或刷新流。

编辑:另外,这可能是文件系统问题。sync在文件系统上做一个。

于 2013-05-08T08:34:00.333 回答
1

输出在进程内的内存缓冲区中。

如果没有无限循环,缓冲区会在进程退出之前由 C 库中的代码刷新。

修复它的一种简单方法是插入:

setlinebuf(stdout);

在程序开始时:然后每行将在写入后刷新。(请参阅man setbuf(3)。)您也可以fflush()在进入无限循环之前,但是如果您希望该程序在计算之间滴出输出,那么只修复一次缓冲比记住每次都刷新更简单。

C 在写入终端时默认使用行缓冲,但在写入文件时默认使用更大的缓冲区,这就是为什么没有重定向就看不到这一点的原因。

于 2013-05-08T08:37:54.667 回答
0

尝试这个:

#include <stdio.h>
main (void) {
printf("Hello world\n");
fflush(stdout); // <--
while(1);
}

对于输出流,fflush()通过流的底层写入函数强制写入给定输出或更新流的所有用户空间缓冲数据。

于 2013-05-08T08:39:17.550 回答