【问题标题】:Redirect FILE * stream into custom handler in Qt将 FILE * 流重定向到 Qt 中的自定义处理程序
【发布时间】:2017-07-16 18:05:57
【问题描述】:

我想将一个 C 库集成到我的 C++/Qt 项目中。该库接受 FILE* 流以打印调试消息(而不是为日志回调函数提供挂钩...)。

如果我只通过stderr,它可以正常工作,但我想将它集成到我自己的日志基础设施中,它使用qDebug() 和 co。

我最初的想法是使用socketpair(),获取发送方fd的FILE*流,将其传递给库,并使用QSocketNotifier处理接收方,但我遇到了两个问题:

  • 虽然有适用于 Windows 的实现,但它不是多平台的。
  • 我的应用程序是单线程的(我希望保持这种状态),这意味着套接字对的 2 个套接字是从同一个线程写入和读取的。这似乎会在一段时间后陷入僵局。

还有哪些其他方法可以提供 FILE* 流,将其读取集成到 Qt 的事件循环中,不需要多线程,并且是多平台的?

【问题讨论】:

  • 它是一个公共的 C 库吗?如果是,是哪一个?也许你可以很容易地修改它。
  • 从 C++ 调用 C 函数不符合 C 标记的条件。
  • @Holt,来自 gpsd 的 libgps,我可以修补它,但这是最后的选择(假设我想分发该程序,并且我不想随它一起发布修改后的 lib)。我会考虑向项目发送补丁。

标签: c++ qt qdebug


【解决方案1】:

只要您可以获取存储的文件描述符,您就可以在 Linux 上使用不可移植的 fdopen 和在 Windows 上使用 _fdopen 从中获取 FILE*

您还可以使用pipe/_pipe 在 Linux 和 Windows 上创建常规管道。

管道应该与 Qt 事件循环集成。我不熟悉 Qt API,可能是它为此公开了可移植的 API。也许你可以使用QLocalSocket Class

QLocalSocket 类提供了一个本地套接字。在 Windows 上这是一个命名管道,在 Unix 上这是一个本地域套接字。

它具有qintptr QLocalSocket::socketDescriptor() const 方法,该方法返回可以用fdopen 包装的文件描述符以生成FILE*

【讨论】:

  • Calling Qt functions from Unix signal handlers 提供有关“管道到自我”技巧的有用建议
  • @BasileStarynkevitch 该示例可以只使用一个管道来处理所有将signo 写入其中的信号,而不是使用socketpair 来处理每个没有传递有用数据的信号。
  • @MaximEgorushkin,我想调整消息(以时间戳、[DGB] 等标签为前缀),因此直接授予对存储的访问权限不是一个选项。我要试试 pipe(),谢谢。
  • @BasileStarynkevitch,是的,我知道这一点,但它使用我在问题中提到的 socketpair()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2019-07-05
  • 2011-05-19
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
相关资源
最近更新 更多