Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c样式stdout/stderr写入时的通知?_C++_Qt - Fatal编程技术网

C++ c样式stdout/stderr写入时的通知?

C++ c样式stdout/stderr写入时的通知?,c++,qt,C++,Qt,我正在创建一个类,它捕获所有控制台输出并将其转储到一个日志中。我需要这个,因为我的程序使用了许多我无法更改的第三方库。这些库中的有用信息通过几种方式打印到控制台。我知道如何使用rdbuf用自定义流缓冲区替换cout/cerr。我不需要帮助。我还知道如何创建一个管道来捕获c风格的输出,例如,fprintf(stdout,“Hello,world!”)。然而,与我可以在输入时处理输出的自定义流缓冲区不同,c风格的输出现在卡在这个管道中,我必须定期刷新所有内容并从中读取。我更希望得到一个通知或安装一个

我正在创建一个类,它捕获所有控制台输出并将其转储到一个日志中。我需要这个,因为我的程序使用了许多我无法更改的第三方库。这些库中的有用信息通过几种方式打印到控制台。我知道如何使用
rdbuf
用自定义流缓冲区替换
cout
/
cerr
。我不需要帮助。我还知道如何创建一个管道来捕获c风格的输出,例如,
fprintf(stdout,“Hello,world!”)
。然而,与我可以在输入时处理输出的自定义流缓冲区不同,c风格的输出现在卡在这个管道中,我必须定期刷新所有内容并从中读取。我更希望得到一个通知或安装一个回调来处理管道输入

Qt也在这里。我一直在玩
QSocketNotifier
类,但它似乎不适用于管道读取或写入文件描述符


建议?

在Linux上,我们用于重定向标准流:

freopen (outfile, "a", stdout);
freopen (outfile, "a", stderr);
我不相信有任何方法可以得到通知

现在输出卡在这个管道中,我必须定期刷新所有内容并从中读取。我更希望得到一个通知或安装一个回调来处理管道输入

不清楚“一切”是什么,也不清楚为什么您需要做的不仅仅是刷新特定的文件流,但这听起来像是指这些流是缓冲的,因此在满足刷新条件或执行
flush()
之前,您连接它们的管道不会被写入

此外,我们不知道您是在操作第3层文件流还是第2层文件描述符。我们不知道您是否禁用了C++流和第3层流之间的同步。 综上所述,可以使用

setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
这意味着您不再需要
flush()
来执行(例如,
fprintf()
调用)来写入管道


为此,,您可以设置轮询/选择调用来检查管道上的数据,也可以让线程执行阻塞读取,然后将数据传输到其他地方。

C++和C不是同一件事,恐怕无法实现您的愿望。这是一个X-Y问题。只需在管道上阻塞一个线程。哪个操作系统你需要这样做吗?在stdout/stderr上使用setvbuf禁用C层3缓冲,并使用dup和dup2重定向到管道写入端,在单独的线程中使用管道读取端上的阻塞读取,效果很好。谢谢你的帮助!谢谢你的回答。我以前已经找到了那个解决方案,但它不能满足我的需要。也许,我应该在我的问题中更具体一些:我正在寻找一种方法,将所有控制台消息合并到一个日志文件中。捕获stdout/stderr是这个难题的最后一块。