将printf重定向到两个流

时间:2015-06-16 20:20:46

标签: c

我正在扩展现有的C项目,该项目使用stdout将所有信息打印到printf。我想将这些信息打印到stdout和日志文件中。

如果我是原始项目的贡献者,我只需用我的自定义日志功能替换所有printf次调用。唉,我不是,所以这是我的问题:

是否可以重定向printf以便一次调用同时打印到stdout和文件?

我知道这是一个很长的镜头但是,如果可能的话,我可以获得我想要的东西,而无需修改原始代码。

编辑:感谢您对tee命令的回答和评论。但是,我正在寻找一种直接在C代码中以自动方式进行操作的方法,这样用户就不必费心使用tee了。

感谢您的关注!

3 个答案:

答案 0 :(得分:7)

您正在寻找tee命令:

./prog | tee file

这将在./prog中显示stdout的输出,并将其存储在file中。可以将tee视为管道中的三通夹具:)

<强>更新

如果你不想强迫用户考虑使用tee,我只会创建一个shell脚本,它完全按照我上面的显示 - 用tee调用程序 - 并拥有用户仅与脚本交互。

如果这对您不起作用,并且您确实想要更改源代码,我看不到任何即时的简单解决方案。您可以编写一个写入两个流的printf()包装器,但是您必须继续将每个对printf()的调用替换为您的包装器。

答案 1 :(得分:2)

不确定这是否有帮助,但comp.lang.c常见问题解答列表中存在类似的问题:

http://c-faq.com/stdio/multiway.html

底线:你可以写自己的&#34; twowayprintf&#34;函数然后调用它,但是程序中没有办法安排普通的printf调用到两个地方。如果你想保留现有的printf调用,你将不得不在程序之外工作(使用shell脚本和/或tee命令),正如其他人所描述的那样。

答案 2 :(得分:1)

您可以编写一个简单的包装程序,其中包含:

  • 创建管道和叉子:
    • 在子进程中,关闭管道的输出端,重新打开stdin作为管道的输入端,并exec() tee,给它一个合适的argv向量(日志文件的名称)
    • 在父进程中
    • 关闭管道的输入端,重新打开stdout作为管道的输出端,exec()是原始可执行文件。