2010-10-26 73 views
1

我需要通過守護進程中的「/ bin/sh」執行一些命令。有時這些命令執行時間太長,我需要以某種方式中斷它們。守護進程使用C++編寫,命令使用std :: system()來執行。我需要清理堆棧,以便在線程死亡時調用析構函數。 (在C++異常處理程序中捕獲事件將是完美的)。最簡單的方法來中斷運行進程時被阻塞的線程

線程使用boost:thread創建。不幸的是,在這種情況下,boost :: thread :: interrupt()或pthread_cancel()都是有用的。

我可以想象從編寫我自己的system()版本到找到孩子的process-id和signal()它的幾種方法。但是必須有一個更簡單的方法?

+0

在詢問新問題之前,您可能想要接受一些**前面的問題**的答案。 – ereOn 2010-10-26 15:26:40

回答

2

我並沒有試圖提振::過程,因爲它不是提升的一部分。然而,我嘗試了ACE_Process,它顯示出一些奇怪的行爲(超時有時起作用,有時不起作用)。因此,我編寫了一個簡單的std :: system替換程序,用於輪詢正在運行的進程的狀態(有效地消除多線程進程中的進程範圍信號和報警問題)。我也使用boost :: this_thread :: sleep(),所以boost :: thread :: interrupt()應該可以作爲替代或除了超時。

Stackoverflow.com不能很好地與我的Firefox在Debian下工作(事實上,我根本無法回覆,我必須在VM中啓動Windows)或Opera(在我的VM中),所以我無法以可讀的方式發佈代碼。我的原型(在將其移至實際應用之前)可在此處獲得:http://www.jgaa.com/files/ExternProcess.cpp

0

你可以試試看看Boost.Process: Where is Boost.Process? 我一直在等這麼長的時間。

如果你願意使用Qt,一個漂亮的便攜式解決方案是QProcess中: http://doc.trolltech.com/4.1/qprocess.html

當然,你也可以做出這樣Let_Me_Be自己特定的系統解決方案建議。

無論如何,你可能不得不擺脫system()函數調用,並用一個更強大的替代方法替代它。

2

任何使用system命令執行的命令都會在新進程中執行。不幸的是,系統會暫停當前進程的執行,直到新進程完成。如果子進程掛起,則新進程也會掛起。

解決這個問題的方法是使用fork創建一個新進程並調用其中一個exec調用來執行所需的命令。您的主進程可以在子進程的進程Id(pid)上輸入wait。可以通過在調用wait之前使用alarm呼叫生成SIGALRM來實現超時。

如果子進程超時,可以使用kill命令將其終止。嘗試先用SIGTERM,如果失敗則可以再試一次將SIGKIL升,這肯定會殺死子進程。

叉子和exec一些詳細信息,可以發現here