0

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

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

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

  • 它不是多平台的,尽管有适用于 Windows 的实现。
  • 我的应用程序是单线程的(我想保持这种方式),这意味着套接字对的 2 个套接字是从同一个线程写入和读取的。一段时间后,这似乎以僵局告终。

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

4

1 回答 1

1

只要您可以获取存储的文件描述符,就可以在 Linux 和Windows上FILE*使用 unportable从中获取。fdopen_fdopen

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

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

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

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

于 2017-07-16T18:27:24.167 回答