如何同时将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
相关产品推荐
相关产品推荐

