当c风格的stdout / stderr写入时通知
Notification when c-style stdout / stderr written to?
我正在创建一个捕获所有控制台输出并将其转储到一个日志中的类。我需要这个,因为我的程序使用了许多第三方库,我不能改变。这些库中的有用信息以几种方式打印到控制台。我知道使用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);
我不相信有任何方法可以获得通知
相关文章:
- 如何将stdout重定向到stderr
- 函数如何通知用户它基于函数原型抛出异常?
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 如何在点击通知时捕获用户的点击操作
- 在通知提升间处理条件变量时未按住锁会导致问题
- 通知条件变量后使用互斥锁
- 如何在不设置值的情况下通知 c++ 未来?
- 将 clangd stderr 重定向到文件而不是控制台
- 使用 ISdigit 通知任何检测到的非法字符
- Qt:如何通知对象已建立涉及它的信号槽连接
- 提升进程间named_condition_any不通知
- Windows Toast 通知不适用于 MS CPP 示例代码
- C++ Poco - 如何创建通知队列的向量?
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++ Windows 通知:使用依赖模板名称
- 当c风格的stdout / stderr写入时通知