我怎么能临时将stdout重定向到C程序中的文件?

Fra*_*ank 25 c redirect stdout

在我的C程序中,我想暂时将STDOUT重定向到"/ dev/null"(例如).然后写入"/ dev/null"后我想恢复STDOUT.我该如何管理?

R..*_*R.. 51

在POSIX系统上,您可以按如下方式执行此操作:

int bak, new;
fflush(stdout);
bak = dup(1);
new = open("/dev/null", O_WRONLY);
dup2(new, 1);
close(new);
/* your code here ... */
fflush(stdout);
dup2(bak, 1);
close(bak);
Run Code Online (Sandbox Code Playgroud)

你想要的是进一步的普遍性是不可能的.

使用任何解决方案freopen都是错误的,因为它不允许您恢复原始stdout.通过赋值的任何解决方案stdout都是错误的,因为stdout它不是左值(它是扩展为类型表达式的宏FILE *).

  • @MoraruLilian:我非常故意使用`dup2`.你的评论所有论点都与我的代码混在一起,所以我不能确定你的观点是什么,但任何没有'dup2`的解决方案都有**危险的竞争条件**.`dup2(x,y)`的意思是用`x`的副本原子地替换`y`****. (11认同)