自学内容网 自学内容网

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)!