2017-07-16 33 views
0

我想將C庫集成到我的C++/Qt項目中。該庫接受FILE *流以打印調試消息(而不是爲日誌記錄回調函數提供鉤子)。將FILE *流重定向到Qt中的自定義處理程序中

它正常工作,如果我只通過stderr,但我想將它集成到我自己的日誌記錄基礎結構中,它使用qDebug()和co。

我最初的想法是利用socketpair(),得到了發送端的fd的FILE *流,它傳送給庫,並處理好與QSocketNotifier中的接收方,但我打了2個問題吧:

  • 這不是多平臺,雖然有Windows的實現。
  • 我的應用程序是單線程的(我想保持這種方式),這意味着socketpair的2個套接字是從同一個線程寫入和讀取的。這似乎在一段時間後會以僵局結束。

什麼是其他方法存在提供FILE *流,將其閱讀整合到Qt的事件循環,不需要多線程,並且是多平臺?

+0

它是一個公共C庫嗎?如果是,哪一個?也許你可以很容易地修改它。 – Holt

+0

從C++調用C函數不符合C標籤。 – Olaf

+0

@Holt,來自gpsd的libgps,我可以修補它,但它是最後一個選項(假設我想分發該程序,並且我不想用它發佈修改後的lib)。我會考慮給這個項目發一個補丁。 – zgyarmati

回答

1

只要你可以得到一個文件描述符到存儲,您可以使用不可移植fdopen Linux和_fdopen在Windows上從它那裏得到FILE*

您還可以在Linux和Windows上使用pipe/_pipe創建常規管道。

而一個管道應該與Qt事件循環集成。我不熟悉Qt API,可能會爲此暴露便攜式API。可能是你可以使用QLocalSocket Class

QLocalSocket類提供了一個本地套接字。在Windows上,這是一個命名管道,在Unix上,這是一個本地域套接字。

qintptr QLocalSocket::socketDescriptor() const方法,返回文件描述符可以用fdopen包裹做出FILE*

+0

[從Unix信號處理程序中調用Qt函數](http://doc.qt.io/qt-5/unix-signals.html)提供了有關「管道自我」的有用建議, trick –

+0

@BasileStarynkevitch這個例子可以使用一個管道來寫入'signo'的所有信號,而不是每個都傳遞無用數據的'socketpair'。 –

+0

@MaximEgorushkin,我想調整消息(以時間戳爲前綴,標籤像[DGB]等),所以直接訪問存儲不是一個選項。我要去嘗試pipe(),thx。 – zgyarmati

相關問題