You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时将stdio输出重定向到文件并在终端打印?

同时将stdio输出重定向到文件与终端的方法

完全可以做到一次运行程序,同时把输出送到终端和文件,下面分两种常用场景说明:

命令行层面(无需修改代码)

直接用tee命令配合管道实现,这是最简便的方式:

  • 覆盖写入文件:
    ./your_program | tee output.log
    
  • 追加写入文件(不覆盖原有内容):
    ./your_program | tee -a output.log
    

tee的核心作用就是读取标准输入的内容,同时输出到标准输出(终端)和指定文件,完美匹配需求。

程序代码层面(适合需要在代码内控制的场景)

以C语言为例,通过复制文件描述符实现双输出:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
    // 保存原始终端的stdout文件描述符
    int term_stdout = dup(STDOUT_FILENO);
    // 打开日志文件(创建/截断模式,权限0644)
    int log_fd = open("output.log", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (log_fd == -1) {
        perror("Failed to open log file");
        return 1;
    }
    // 将默认stdout重定向到日志文件
    dup2(log_fd, STDOUT_FILENO);
    close(log_fd);

    // 定义宏实现双输出:同时写日志文件和终端
    #define dual_print(...) do { \
        printf(__VA_ARGS__);          // 写到日志文件(当前stdout)
        dprintf(term_stdout, __VA_ARGS__); // 写到终端
    } while(0)

    // 测试输出
    dual_print("This message shows in both terminal and log file\n");
    dual_print("Another test line\n");

    // 可选:恢复原始stdout
    dup2(term_stdout, STDOUT_FILENO);
    close(term_stdout);

    return 0;
}

这段代码通过dup保存终端的输出句柄,用dup2重定向默认输出到文件,再通过dprintf直接向终端句柄写内容,实现同一内容双端输出。

内容的提问来源于stack exchange,提问作者JKHA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:42:46