確保子進程在父進程中被終止的推薦方法是將它們放入Job對象中。但是,如果父進程在對CreateProcess和AssignProcessToJobObject的調用之間中斷,則子進程將繼續運行。我怎樣才能消除這種競爭條件?避免CreateProcess和AssignProcessToJobObject之間的時間窗口
回答
您可以使用CREATE_SUSPENDED
作爲CreateProcess
參數dwCreationFlags
參數之一的標誌之一。
然後,使用PROCESS_INFORMATION
結構中返回的線程句柄在調用AssignProcessToJobObject
之後調用ResumeThread
。
僞代碼沒有錯誤處理:
STARTUPINFO startUp;
PROCESS_INFORMATION processInfo;
CreateProcess (NULL, /* whatever */, NULL, NULL, TRUE,
CREATE_SUSPENDED | CREATE_NEW_PROCESS_GROUP, NULL, NULL,
&startUp, &processInfo);
AssignProcessToJobObject(hJobObject, processInfo.hProcess);
ResumeThread (processInfo.hThread);
您可以使用名爲事件您從應用程序同步:
- 主創建一個名爲事件ž
- 主機啓動從屬進程
- 從屬進程打開命名事件並等待信號狀態
- m aster進程執行作業對象事件
- 主進程集事件Z
- 從對象看到事件Z集並繼續執行它應該執行的操作或超時(如果主進程在將從進程分配給作業對象之前死亡)只是立即退出
我不寫孩子程序,但CREATE_SUSPENDED,在另一個答案中提到,具有與您的事件相同的效果。我的問題是父母可能在產生孩子之後並在將其添加到作業對象之前死亡。 –
這樣,如果在將從屬進程添加到作業對象之前主進程被終止,則子進程會立即終止。 –
我現在明白了。不過這對我並不適用,因爲我正在爲我的孩子調用一個預先存在的exe文件。我不能重寫它來遵循你的協議。 –
- 1. 按鈕和窗口之間的空間
- 2. bootstrap - 當窗口最大化時避免控件之間的空隙
- 3. 使用僞類時避免DOM之間的空間:
- 4. 避免長連接時間
- 5. 避免在時間之間插入sql插入
- 6. 避免html標記之間的空格
- 7. 如何避免之間的文本{{}}
- 8. 避免img之間的空格
- 9. 窗口和ViewController之間的區別
- 10. DWM和Direct3D窗口之間的同步
- 11. 格式化Rails和Javascript之間的時間 - 避免重複跨語言代碼
- 12. 關閉子窗口時避免MessageBox
- 13. 如何在html中的兩個窗口之間傳遞參數[父窗口和子窗口之間的值]
- 14. WinAPI - 避免重繪窗口
- 15. 避免斜槓(/)彈簧RequestMapping之間
- 16. 避免在標籤之間切換
- 17. wpf中父窗口和子窗口之間的通信
- 18. TCP - 擁塞窗口和接收窗口之間的區別
- 19. 彈出窗口和瀏覽器動作窗口之間的chrome.storage
- 20. 滑動窗口和擁塞窗口之間的差異
- 21. SIGNAL和2個窗口之間SLOT QT
- 22. 選擇時間窗和滑動時間窗口
- 23. 窗口事件之間
- 24. 避免在用戶和內核空間之間複製數據,反之亦然
- 25. 避免在nodejs和apache之間的端口80上發生衝突
- 26. python命令安排12.00h到13.30h之間的時間窗口
- 27. Chrome 1px不可避免td之間的間距
- 28. 避免RPC(SOAP)API之間的中間數據轉換?
- 29. 避免git中的時間戳
- 30. 避免長時間POST的PHP
您的代碼在作業對象中捕獲它之前會防止孩子產生更多的進程,但是如果父代在AssignProcessToJobObject之前死亡,則子代會泄漏。 –