2016-04-21 202 views
2

我正在尋找一種在C++中以跨平臺方式進行基本進程管理的方式,但我無法使用外部庫(如boost :: process)。 場景是這樣的 - 我打電話給std :: system, 的子進程,以防父進程被一個信號中斷,我需要在退出之前殺掉子進程,以避免它作爲殭屍。 我讀過信號處理,但我不知道如何殺死在句柄函數中使用std :: system創建的進程。 是否有另一種/更好的方法來做到這一點?在C++跨平臺啓動和終止進程

+0

如果父母去世,孩子變成了孤兒,而不是殭屍。殭屍是一個沒有收穫的死亡孩子。 –

+0

對此的解決方案依賴於系統。從你的描述來看,你似乎是在unix上(例如linux,BSD等)或類似的。是POSIX嗎?如果是這樣,您將擁有一組可用於查找/終止進程的與平臺相關的函數(儘管posix的某些方面是鬆散指定的,因此實現因系統而異)。如果你有多種目標系統(比如posix和non-posix),你肯定會針對不同的目標需要不同的解決方案。除了使用第三方庫之外,在標準C++中沒有解決方案(反過來,它依靠平臺依賴關係) – Peter

回答

1

C++最近得到了線程的語義,但是它沒有(還有)具有進程的語義。因此,它不提供任何殺死系統上正在運行的進程的設施。

因此,唯一可行的方法是讓父進程向子進程發送某種信號,並使子進程在接收到信號時自行終止。有多種方法可以進行這種信令(例如,通過OS信號,通過標準IPC原語,通過網絡),但標準C++並不爲大多數方式提供任何便攜式機制。因此,您最終會選擇使用外部庫(例如Boost,Qt等)或將您的實現限制爲一組受支持的系統(例如,POSIX OS,在這種情況下,您甚至可以直接調用kill) 。

1

流程管理特定於每個平臺。經典的方式(如果你不想使用外部庫)是每個平臺編寫代碼,並將其與編譯時的預處理條件分開:

// For both OS X and iOS 
#ifdef __APPLE__ 
    // includes or code 
#endif 

// For Windows: 
#ifdef __MINGW32__ 
    // includes or code 
#endif  

// For Linux: 
#ifdef __linux__ 
    // includes or code 
#endif 

這裏有更多的解決方案: How to identify platform/compiler from preprocessor macros?