Windows程式設計之作業篇
因為Windows沒有維護程序中父子關係(僅僅在建立子程序的一瞬間具有父子關係),所以想通過父程序來控制子程序是很困難的。為此,Windows推出了一個特殊的核心物件---作業(Job),作業就像是一個天然“沙箱”,可以對其中的程序進行時間、記憶體以及許可權等限制。
- 作業使用步驟
- 首先需要建立作業核心物件,通過一下函式來建立作業核心物件
HANDLE CreateJobObject( PSECURITY_ATTRIBUTES pas, PCTSTR pszName );
與其他核心物件一樣的,第一個引數用於指定作業物件的安全資訊,以及是否可繼承
-
其次,是對作業中的程序進行設限,具體通過SetInformationJobObject()來實現
BOOL SetInformationJobObject( HANDLE hJob, JOBOBJECTINFOCLASS JobObjectInformationClass, PVOID pJobObjectInformation, DWORD cbJobObjectInformationSize );
第一個引數用於指定設限的作業,第二個引數用於指定設限的型別,第三個引數用於指向儲存具體設限內容的資料結構,第四個引數表示此資料結構的大小。具體內容請參看
-
設定好限制之後,我們需要建立程序,就像平常一樣建立程序,但是需要設定CREATE_SUSPENDED這個標誌。如果不設定,子程序會在建立完成後立即開始執行程式碼,即逃離沙箱,如果想真正的限制住它,就需要讓它在建立完成後不執行任何程式碼,再通過AssignProcessToJobObject()將程序放入沙箱(作業)
BOOL AssignProcessToJobObject( HANDLE hJob, HANDLE hProcess );
-
當程序建立完成並放入作業中後,我們需要將掛起的程序恢復執行,通過ResumeThread()即可
DWORD WINAPI ResumeThread( HANDLE hThread );
-
最後,想要在作業所屬程序中知道子程序何時結束,可以簡單地用WaitForSingleObject()來獲取程序核心物件的觸發狀態。對於核心物件而言,擁有觸發與未觸發兩個狀態,當達到觸發狀態時,WaitForSingleObject()會捕捉到並返回。而對於程序核心物件而言,只有當程序結束時它的記憶體物件才會變成觸發狀態。
DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds );
- 首先需要建立作業核心物件,通過一下函式來建立作業核心物件
-
PS:當設定的時間限制和記憶體限制太小,會出現引數錯誤而導致設限失敗,而如果記憶體限制小於程序需要的記憶體空間時,會出現應用程式錯誤
-
PS:具體參考程式碼請前往 https://git.oschina.net/Explorer0/codes 處,如有錯誤,敬請指出~