我正在扩展现有的C项目,该项目使用stdout
将所有信息打印到printf
。我想将这些信息打印到stdout和日志文件中。
如果我是原始项目的贡献者,我只需用我的自定义日志功能替换所有printf
次调用。唉,我不是,所以这是我的问题:
是否可以重定向printf
以便一次调用同时打印到stdout
和文件?
我知道这是一个很长的镜头但是,如果可能的话,我可以获得我想要的东西,而无需修改原始代码。
编辑:感谢您对tee
命令的回答和评论。但是,我正在寻找一种直接在C代码中以自动方式进行操作的方法,这样用户就不必费心使用tee了。
感谢您的关注!
答案 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()
是原始可执行文件。