Linux输出重定向到文件立即输出
./md.out > output.txt 2>&1
程序中断时,文件为空的原因可能是由于缓冲机制。标准输出(stdout)和标准错误输出(stderr)默认是缓冲的,这意味着数据在写入文件之前会先存储在缓冲区中。如果程序在缓冲区的数据被写入文件之前中断,这些数据将不会出现在文件中。
为了确保数据即时写入文件,你可以使用以下几种方法:
方法一:使用 stdbuf
设置无缓冲
stdbuf
可以控制标准输出和标准错误输出的缓冲模式。使用如下命令设置无缓冲:
stdbuf -oL -eL ./md.out > output.txt 2>&1
其中,-oL
和 -eL
分别设置标准输出和标准错误输出为行缓冲模式,这样可以在每行输出后立即写入文件。
方法二:在程序代码中设置无缓冲
如果可以修改程序代码,可以在程序开始时设置标准输出和标准错误输出为无缓冲。以 C 或 C++ 程序为例:
#include <stdio.h>
int main() {
setvbuf(stdout, NULL, _IONBF, 0); // 设置标准输出为无缓冲
setvbuf(stderr, NULL, _IONBF, 0); // 设置标准错误输出为无缓冲
// 你的程序代码
return 0;
}
方法三:使用 fflush
在关键位置使用 fflush(stdout)
和 fflush(stderr)
,确保缓冲区数据被即时写入文件。例如:
#include <stdio.h>
int main() {
printf("This is a message.\n");
fflush(stdout); // 强制刷新标准输出缓冲区
fprintf(stderr, "This is an error message.\n");
fflush(stderr); // 强制刷新标准错误缓冲区
// 你的程序代码
return 0;
}
方法四:使用 script
命令
script
命令可以捕获所有输出并立即写入文件:
script -q -c "./md.out" output.txt
script
命令会启动一个子shell,执行你的程序,并将所有输出写入指定文件。
注意:使用 script 命令虽然可以捕获所有输出并写入文件,但它的输出并不是实时更新的。
方法五:检查缓冲区大小设置
某些情况下,你可以通过设置环境变量来影响缓冲区行为。例如:
export PYTHONUNBUFFERED=1
./md.out > output.txt 2>&1
这对于 Python 脚本非常有效。
通过以上方法,你可以确保程序的输出被即时写入文件,避免因程序中断而导致文件为空的情况。
原文地址:https://blog.csdn.net/weixin_57097753/article/details/140545372
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!