Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将程序回送到文件,即使有人杀死程序(linux)_C_Linux_Echo_Kill - Fatal编程技术网

C 将程序回送到文件,即使有人杀死程序(linux)

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

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

例如,此程序test.c

#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
不会有任何帮助。我怀疑您是否能够测量性能上的任何差异,除非程序编写大量消息而很少做其他工作。微优化可能会丢失日志数据(如果您忘记刷新)并且没有明显的好处是毫无帮助的。如果您每秒生成兆字节的日志输出,可能会有问题,但这不是典型的问题。