1. 程式人生 > >Windows程式設計之作業篇

Windows程式設計之作業篇

    因為Windows沒有維護程序中父子關係(僅僅在建立子程序的一瞬間具有父子關係),所以想通過父程序來控制子程序是很困難的。為此,Windows推出了一個特殊的核心物件---作業(Job),作業就像是一個天然“沙箱”,可以對其中的程序進行時間、記憶體以及許可權等限制。

  •     作業使用步驟
    1. 首先需要建立作業核心物件,通過一下函式來建立作業核心物件
      HANDLE CreateJobObject(
        PSECURITY_ATTRIBUTES pas,
        PCTSTR pszName
      );

      與其他核心物件一樣的,第一個引數用於指定作業物件的安全資訊,以及是否可繼承

    2. 其次,是對作業中的程序進行設限,具體通過SetInformationJobObject()來實現

      BOOL SetInformationJobObject(
        HANDLE hJob,
        JOBOBJECTINFOCLASS JobObjectInformationClass,
        PVOID pJobObjectInformation,
        DWORD cbJobObjectInformationSize
      );

      第一個引數用於指定設限的作業,第二個引數用於指定設限的型別,第三個引數用於指向儲存具體設限內容的資料結構,第四個引數表示此資料結構的大小。具體內容請參看

      https://msdn.microsoft.com/en-us/library/windows/desktop/ms686216(v=vs.85).aspx

    3. 設定好限制之後,我們需要建立程序,就像平常一樣建立程序,但是需要設定CREATE_SUSPENDED這個標誌。如果不設定,子程序會在建立完成後立即開始執行程式碼,即逃離沙箱,如果想真正的限制住它,就需要讓它在建立完成後不執行任何程式碼,再通過AssignProcessToJobObject()將程序放入沙箱(作業)

      BOOL AssignProcessToJobObject(
        HANDLE hJob,
        HANDLE hProcess
      );

                 

    4. 當程序建立完成並放入作業中後,我們需要將掛起的程序恢復執行,通過ResumeThread()即可

      DWORD WINAPI ResumeThread(
        HANDLE hThread
      );

               

    5. 最後,想要在作業所屬程序中知道子程序何時結束,可以簡單地用WaitForSingleObject()來獲取程序核心物件的觸發狀態。對於核心物件而言,擁有觸發與未觸發兩個狀態,當達到觸發狀態時,WaitForSingleObject()會捕捉到並返回。而對於程序核心物件而言,只有當程序結束時它的記憶體物件才會變成觸發狀態。

      DWORD WaitForSingleObject( 
        HANDLE hHandle,
        DWORD dwMilliseconds
      );

                    

  • PS:當設定的時間限制和記憶體限制太小,會出現引數錯誤而導致設限失敗,而如果記憶體限制小於程序需要的記憶體空間時,會出現應用程式錯誤   

  • PS:具體參考程式碼請前往 https://git.oschina.net/Explorer0/codes 處,如有錯誤,敬請指出~