当c风格的stdout / stderr写入时通知

Notification when c-style stdout / stderr written to?

本文关键字:通知 stderr 风格 stdout      更新时间:2023-10-16

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

Qt也在其中。我一直在玩QSocketNotifier类,但它似乎不工作管道读或写文件描述符。

建议吗?

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

不清楚"一切"是什么,或者为什么你需要做的不仅仅是刷新特定的文件流,但这听起来像是你指的是这些流被缓冲,所以你连接它们的管道不会被写入,直到刷新条件满足或flush()被执行。

此外,我们不知道你是在操作第3层文件流还是第2层文件描述符。我们不知道你是否已经禁用了c++流和三层流之间的同步。

也就是说,可以使用

禁用C层3缓冲
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);

这意味着您将不再需要flush(),例如,将fprintf()调用写入管道。

为此,您可以设置一个poll/select调用来检查管道上的数据,或者您可以简单地让线程执行阻塞读取并将数据传输到其他地方。

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

freopen (outfile, "a", stdout);
freopen (outfile, "a", stderr);

我不相信有任何方法可以获得通知