将FILE *流重定向到Qt

时间:2017-07-16 18:05:57

标签: c++ qt qdebug

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  

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

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