C 将程序回送到文件,即使有人杀死程序(linux)
我有一个C程序,它向控制台输出一些信息,然后进入无限循环。我需要在后台运行程序,并将输出重定向到日志文件。如果程序没有无限循环,则重定向有效;如果程序有无限循环,则什么都不写 例如,此程序test.c:C 将程序回送到文件,即使有人杀死程序(linux),c,linux,echo,kill,C,Linux,Echo,Kill,我有一个C程序,它向控制台输出一些信息,然后进入无限循环。我需要在后台运行程序,并将输出重定向到日志文件。如果程序没有无限循环,则重定向有效;如果程序有无限循环,则什么都不写 例如,此程序test.c: #include <stdio.h> main (void) { printf("Hello world\n"); while(1); } #包括 主(空){ printf(“Hello world\n”); 而(1),; } 如果我运行它,我会在控制台上看到一行Hello wo
#include <stdio.h>
main (void) {
printf("Hello world\n");
while(1);
}
#包括
主(空){
printf(“Hello world\n”);
而(1),;
}
如果我运行它,我会在控制台上看到一行Hello world,但是如果我运行/test>logfile我不会在文件上写入任何内容
有什么办法可以这样做吗
谢谢 欢迎来到缓冲输入/输出的世界 使用非缓冲系统调用(
打开
,读取
,写入
)或刷新流
编辑:另外,这可能是一个文件系统问题。在文件系统上执行同步。欢迎来到缓冲输入/输出的世界 使用非缓冲系统调用(
打开
,读取
,写入
)或刷新流
编辑:另外,这可能是一个文件系统问题。在文件系统上执行同步。输出在进程内的内存缓冲区中 如果没有无限循环,缓冲区将在进程退出之前由C库中的代码刷新 一种简单的修复方法是插入:
setlinebuf(stdout);
在程序开始时:然后每一行在写入后都将被刷新。(请参阅。)在进入无限循环之前,您也可以fflush()
,但是如果您希望此程序在计算之间慢慢输出,那么只修复一次缓冲区比记住每次刷新要简单
C在写入终端时默认为行缓冲,但在写入文件时默认为更大的缓冲,这就是为什么在没有重定向的情况下看不到这一点。输出在进程内的内存缓冲区中 如果没有无限循环,缓冲区将在进程退出之前由C库中的代码刷新 一种简单的修复方法是插入:
setlinebuf(stdout);
在程序开始时:然后每一行在写入后都将被刷新。(请参阅。)在进入无限循环之前,您也可以fflush()
,但是如果您希望此程序在计算之间慢慢输出,那么只修复一次缓冲区比记住每次刷新要简单
C在写入终端时默认使用行缓冲,但在写入文件时使用更大的缓冲,这就是为什么在没有重定向的情况下看不到这一点。尝试以下方法:
#include <stdio.h>
main (void) {
printf("Hello world\n");
fflush(stdout); // <--
while(1);
}
#包括
主(空){
printf(“Hello world\n”);
fflush(stdout);//试试这个:
#include <stdio.h>
main (void) {
printf("Hello world\n");
fflush(stdout); // <--
while(1);
}
#包括
主(空){
printf(“Hello world\n”);
fflush(stdout);//setbuf(stdout,NULL);
setbuf(stdout,NULL)不,这不是文件系统问题。本地读取将看到写入文件系统的所有内容,除非机器在这段时间内崩溃。我的错。我将删除它。不,这不是文件系统问题。本地读取将看到写入文件系统的所有内容,除非机器在这段时间内崩溃。我的错。我将删除它。谢谢你的帮助解释。我理解这个问题。它起作用了。我认为在这里调用fflush
更合适。@BasileStarynkevitch,有什么理由这样认为吗?更改缓冲会略微降低性能。调用几次fflush
都不会,一切都会有帮助。我怀疑你是否能够测量一个性能上的差异,除了在人为的情况下,程序写入大量消息,而很少做其他工作。可能丢失日志数据的微优化(如果忘记刷新)没有明显的好处是没有任何帮助的。如果你每秒产生兆字节的日志输出,你可能会有问题,但这不是典型的。谢谢你的解释。我理解这个问题。它起作用了。我相信在这里调用fflush
更合适。@BasileStarynkevitch有什么原因吗出于这一信念?更改缓冲将略微降低性能。调用几次fflush
不会有任何帮助。我怀疑您是否能够测量性能上的任何差异,除非程序编写大量消息而很少做其他工作。微优化可能会丢失日志数据(如果您忘记刷新)并且没有明显的好处是毫无帮助的。如果您每秒生成兆字节的日志输出,可能会有问题,但这不是典型的问题。