2014-10-30 80 views
1

我正在用openFrameworks編寫一個程序,一個C++框架。我想啓動另一個應用程序,並通過stdin和stdout與它通信。我可以使用ofThread類方便地啓動一個新線程。我曾計劃創建兩個管道,並將std重定向到管道(使用dup2),但不幸的是,這會重定向整個應用程序的管道,而不僅僅是線程。C++如何用新的stdin和stdout啓動一個進程

有沒有辦法啓動另一個應用程序,並能夠讀取其輸出並提供輸入?

回答

3

而不是另一個線程,您需要使用fork()函數(可能涉及另一個線程本身)創建子進程。

區別在於,fork創建父進程環境的完整副本,該進程環境應在子進程範圍內的exec()調用中顯示,而來自線程的exec()嘗試共享其父進程中的所有資源(線程),因此可能會導致意外的併發(競爭條件)問題。

+0

'從一個線程exec'消滅了*全程*。你真的必須首先使用'fork'。 ('fork'只把調用線程複製到新進程中,所以你必須確保你不需要在'fork'和'exec'之間執行的代碼中的任何鎖。) – zwol 2014-10-30 12:56:21

0

如果您的「另一個應用程序」作爲您現有程序中的一個子線程實現,您不需要需要重定向stdin和stdout以通過管道與它通信。只需在啓動時將管道文件描述符傳遞給子線程即可。 (您可以使用fdopen包文件描述符文件中的對象。如果你有dup2pipe,你有fdopen爲好。)

+0

合理嗎根據這種情況使用_pipes_?或者你仍然使用'exec()'? – 2014-10-30 03:13:43

+0

另一個應用程序是無法集成的外部應用程序 – 2014-10-30 03:49:31

+0

@πάνταῥεῖ管道當然可以用於線程之間的通信,並且可能比其他任何操作都更方便,具體取決於您嘗試執行的操作。我認爲'exec'是*不涉及。如果涉及'exec',那麼你的回答是正確的。 – zwol 2014-10-30 12:57:34

相關問題