C++ 将标准输出转发到Qt应用程序中的文件

C++ 将标准输出转发到Qt应用程序中的文件,c++,redirect,qt4,stdout,C++,Redirect,Qt4,Stdout,我有一个Qt应用程序,它启动几个QProcess子进程,然后调用QProcess::setChannelMode(QProcess::ForwardedChannels)。然后,我想将此应用程序的stdout(现在包含其子项的stdout)转发到一个日志文件,该文件的位置由应用程序决定,这意味着我不能简单地修改日志以同时写入指定的文件,因为这对子项不起作用,并且我无法运行app|tee logfile,因为我不知道在哪里发球 我更喜欢——如果它存在的话(如果它存在的话,我还没有找到它)——一种通

我有一个Qt应用程序,它启动几个
QProcess
子进程,然后调用
QProcess::setChannelMode(QProcess::ForwardedChannels)
。然后,我想将此应用程序的stdout(现在包含其子项的stdout)转发到一个日志文件,该文件的位置由应用程序决定,这意味着我不能简单地修改日志以同时写入指定的文件,因为这对子项不起作用,并且我无法运行
app|tee logfile
,因为我不知道在哪里发球


我更喜欢——如果它存在的话(如果它存在的话,我还没有找到它)——一种通过Qt实现这一点的方法,但是其他的解决方案是可以接受的。

这不就是QProcess::setStandardOutputFile()吗

很抱歉,我自己从来没有这样做过

这样做的方法是更改底层的
streambuf
,如下面这个相当简单的示例所示:


也许不是最好的方法,但它能完成任务。

好的。作为一个非Qt解决方案,它看起来像是
freopen
将执行我需要的操作:

#include <cstdio>
...
QString logFile;
...
freopen(logFile.toLocal8Bit().data(), "w", stdout);
#包括
...
QString日志文件;
...
freopen(logFile.toLocal8Bit().data(),“w”,标准输出);

这对一个文件和多个进程有效吗?即,它们是否都能写入文件,输出是否会按顺序显示?它们可能都可以写入同一个文件,但我不知道使用了什么底层锁定-如果进程同时运行,您可能会混淆来自进程的消息QProcess的问题方法是1)我还需要原始应用程序的输出,但作为QProcess(我不认为)我无法访问该输出2)我不认为多个进程写入同一个文件可以很好地发挥作用。@Matt:我不认为有解决方案(2)不需要更改所有子进程的代码(添加进程间同步)。看起来像是更改
std::cout.rdbuf()
仅适用于在
std::cout
上执行的操作-例如,printf或子进程的输出不会被转发。@Matt,
printf
调用将采用不同的路径,上述仅适用于cout/cerr等。在实现某种形式的IPC之前,您不会获得一致的输出。。。(即使使用下面的
freopen
解决方案)不幸的是,如果您希望从多个进程写入同一个日志文件,那么您需要实现某种形式的自定义记录器,例如通过套接字工作,并由一个进程负责将接收到的内容写入该文件。您还可以查看boost iostreams库……我怀疑如果多个进程进程同时写入。c库函数不提供任何锁定,我怀疑底层操作系统API是否会提供这种锁定机制,除非特别要求这样做。如果这解决了您的问题,可能会出现这种情况,因为您的日志记录只发生在低频率下,因此问题极不可能发生。