第5章:作業
1. 為了把一組進程當做一個單獨的組來處理,windows提供了一個作業(job)核心對象,它允許我們將進程組合在一起並建立一個”沙箱“來限制進程能夠做什麼。最好把工作物件想象成一個進程容器。理解:從這裡我們要注意關鍵,作業是管理進程集合的容器,所謂管理主要就是對進程行為加以限制!
2. 如果進程已與一個作業關聯,就無法將當前進程或者它的任何子進程從作業中去除,這個安全特性可以確保進程無法擺脫對它施加的限制。
3. 檢測某進程是否與一個作業已經關聯,使用IsProcessInJob函數。
4. 使用CreateJobObject 函數建立作業。
5. 使用SetInformationJobObject 函數對作業中的進程施加限制。限制類型請參考http://msdn.microsoft.com/en-us/library/windows/desktop/ms686216(v=vs.85).aspx,對作業加以限制的內容是本章的重點內容,類型有十種之多,而且對應的結構以及對進程的影響各異。
6. 使用AssignProcessToJobObject 函數把進程放入作業中,如果想在建立進程的同時用作業來管理此進程,應該在建立進程的時候使用CREATE_SUPENDED標誌,加入作業列表後再啟動進程。一旦進程已經屬於作業的一部分,它就不能再移動到另一個作業中,也不能成為所謂”無業的“。當作業中的一個進程產生了另一個進程的時候,新進程將自動成為父進程所屬於的作業的一部分(但可以通過CreateProcess 建立子進程時使用特殊參數使子進程擺脫控制)。
7. 使用TerminateJobObject 函數來終止作業中的所有進程,它是通過對每個進程調用TerminateProcess 來做到的,每個進程的終止後的記憶體清理留給系統自動完成。
8. 使用QueryInformationJobObject 函數來查詢作業當前的限制。查詢型別參數請參考http://msdn.microsoft.com/en-us/library/windows/desktop/ms684925(v=vs.85).aspx。除了查詢限制,還可以查詢作業的統計資訊。注意這裡的型別參數與SetInformationJobObject型別參數不完全相同。每個結構都值得深入研究,這裡這個介面寫的方便性以及文檔的說明品質實在不可恭維。
9. 作業通知通過使用完成連接埠來實現。建立完成連接埠後,通過SetInformationJobObject 帶JobObjectAssociateCompletionPortInformation 參數和完成連接埠控制代碼綁定作業。這樣,系統將監視作業,只要有事件發生,就會把它們投遞到I/O完成連接埠,我們調用GetQueuedCompletionStatus來監視完成連接埠(一般是另開線程做監視動作,使用QueryInformationJobObject來擷取完成鍵和完成連接埠控制代碼)。
10. 對作業完成連接埠的事件處理是使用者需要關心的事情。
11. 對於JeffreyRichter 的光碟片代碼的理解,我在05-JobLab程式中,發現使用建立作業的那個進程建立的CMD視窗明明已經關聯到作業成功,但不能通過QueryInformationJobObject尋找到其進程資訊,已經發了信到微軟,但願得到解答。
對於隨書的代碼內容,很多地方都有。但我也上傳我使用的那一份吧:http://download.csdn.net/detail/eagleatustb/4690967