2014-07-07 96 views
2

這是我的問題 - 我有一個多線程(pthreads)C++應用程序,其中我有一個主控制循環線程和3個數據採集線程(一個串行端口讀取器/寫入器和兩個TCP套接字連接線程)。在程序期間的某些時候,我需要執行一個shell腳本。我已經做了相當的研究,並且看到system()是一個選項。備選方案似乎指示使用fork()exec()功能家族。如何從多線程C++ Linux應用程序安全地運行shell腳本?

我期望的問題是,使用fork()會導致我的進程被複制,顯然這會導致我的通信線程運行沒有問題。由於system()文檔指出它在幕後使用fork(),這也意味着我無法使用它。

我不知道該如何着手。這種問題是否有最佳實踐方法?我可以看到繼續進行的唯一可能的方式是嘗試直接在C++代碼中創建我需要運行的shell腳本的功能。顯然,這樣做所需的工時是最不理想的選擇。我還有其他選擇嗎?

+0

您不是第一個想在多線程程序中使用'fork'的人... –

+0

爲什麼不使用fork來連接其中一個exec函數。也許甚至等待分叉進程完成執行? – wojciii

+0

@ n.m。我不認爲我會這樣做,但是我在這裏發現了令人驚訝的少量信息。因此,這個問題。 – mathematician1975

回答

3

我期望的問題是fork()的使用會導致我的進程被複制,顯然這將導致我的通信線程運行無法完成。

fork()實際上只是複製了調用線程。從man fork

請注意以下幾點進一步指出:

子進程與調用叉單一線程的一個()創建的。父項的整個虛擬地址空間被複制到子項中,包括互斥鎖的狀態,條件 變量和其他pthreads對象; pthread_atfork(3)的使用可能有助於處理 ,這可能會導致問題。

I.e.將不會有一組全新的重複工作線程在後臺造成嚴重破壞。這由POSIX規定。只是不要觸摸互斥等第一件事system()將在叉內做的是呼籲exec(),所以這不是一個問題。選擇使用它還是自己執行fork取決於是否要等待子進程完成,或者只是啓動並繼續。

+0

這很棒,讓我的生活變得更簡單 - 謝謝你的幫助。 – mathematician1975

相關問題