如何缓冲和延迟printf()输出?

时间:2013-05-11 15:22:03

标签: c file-io io buffer printf

我写了一个C程序,在程序中有很多printf()将日志信息输出到stdout。现在我想使用多个进程同时使用不同的参数运行程序。我想使用>将输出从stdout重定向到日志文件。 但是多个进程同时运行,它们的日志信息输出相互重叠,这对于将来的分析可能会造成混淆。

一种解决方案是:考虑到不同的进程将在不同的时间退出,修改C程序,因此每个日志信息都临时写入临时文件。当C程序即将退出时。从临时文件中读取并将内容写入stdout,这需要进行大量修改。

我的想法是:我希望在C程序中,所有printf()输出都可以缓冲,输出只有在进程退出时才会进入stdout / redirection。

是不是可能? 谢谢!

1 个答案:

答案 0 :(得分:0)

这是不可能的,除非您确定输出合理有限(例如总输出小于几兆字节),否则使用发送到某个中央记录器的记录机制(如syslog )。

在Linux和大多数Posix系统上,最简单的日志记录方法是使用专为日志记录设计的syslog(3)(并且能够处理不同的进程)。我认为这是更好的方法。

使用GNU libc,您可以考虑使用open_memstream(3) - 写入内存,在这里您需要确保总输出是有界的 - 并使用atexit(3)将内存流写入将程序退出到某个文件中;你可能想要使用一些锁定机制,如flock(2)等......

J.Holetzeck评论,最简单的方法是将输出重定向到不同的文件(可能使用freopen(3),或者只是在调用shell中),然后合并这些文件。

我猜你使用的是Linux,或者是一些Posix系统。对于Windows,我不知道。