2009-08-24 107 views
2

我正在寫一個C++應用程序,將通過升壓::進程間與其他進程進行通信,但是我需要檢查,如果其他過程實際上是先運行 - 與其他過程負責創建共享內存進程間。如何檢查其他進程是否正在運行?如何檢查進程是否從C++代碼運行?

人,我特別需要檢查其他進程

回答

2

的managed_shared_memory構造函數將拋出的情況下,它無法打開指定的共享內存(假設你open_only傳遞給構造函數)的interprocess_exception。您可以在異常中使用錯誤代碼來測試共享內存是否可用。

所有意味着檢查進程是否正在運行(通過查看進程樹,測試魔法日誌文件或其他),如果遠程進程正在運行,但它尚未管理設置共享內存。

更新:如果你只檢查進程是否正在由操作系統執行,那麼你需要走的進程列表,並考慮各一個。 Here你可以找到一個例子如何做到這一點。

一個更容易的,更便攜,但不太精確的方法是使用鎖文件。進程A在啓動時在某個位置創建一個魔術'鎖文件',並在其終止時將其刪除。過程B然後可以測試該文件的存在以確定過程A是否正在運行。一個空字節大小的文件就足夠了這一點,但該文件還可以包含這有助於處理B(如方法A的PID)的附加信息。但是,在流程A的最開始處有一個很短的時間窗口,在該窗口中不存在鎖定文件 - 但該流程正在運行。

+0

如果使用鎖定文件要小心,如果進程A崩潰並離開它的鎖定文件遊逛。 – 2009-08-24 16:45:19

1

您可以使用互斥或​​嘗試打開共享內存文件和處理異常。

+0

是的,但我特別需要檢查正在運行的進程 – Maciek 2009-08-24 13:27:51

+0

@M。 Utku:如果您控制這兩個應用程序,則互斥測試可以正常進行,因爲互斥鎖通常會在打開應用程序的應用程序關閉時釋放。也就是說,我更喜歡Frerich的解決方案,假設* normal *情況是兩個應用程序都在運行。 – Brian 2009-08-24 13:44:36

相關問題