Windows編程之做業篇

    由於Windows沒有維護進程中父子關係(僅僅在建立子進程的一瞬間具備父子關係),因此想經過父進程來控制子進程是很困難的。爲此,Windows推出了一個特殊的內核對象---做業(Job),做業就像是一個自然「沙箱」,能夠對其中的進程進行時間、內存以及權限等限制。git

  •     做業使用步驟
    1. 首先須要建立做業內核對象,經過一下函數來建立做業內核對象
      HANDLE CreateJobObject(
        PSECURITY_ATTRIBUTES pas,
        PCTSTR pszName
      );

      與其餘內核對象同樣的,第一個參數用於指定做業對象的安全信息,以及是否可繼承windows

    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()便可.net

      DWORD WINAPI ResumeThread(
        HANDLE hThread
      );

               

    5. 最後,想要在做業所屬進程中知道子進程什麼時候結束,能夠簡單地用WaitForSingleObject()來獲取進程內核對象的觸發狀態。對於內核對象而言,擁有觸發與未觸發兩個狀態,當達到觸發狀態時,WaitForSingleObject()會捕捉到並返回。而對於進程內核對象而言,只有當進程結束時它的內存對象纔會變成觸發狀態。code

      DWORD WaitForSingleObject( 
        HANDLE hHandle,
        DWORD dwMilliseconds
      );

                    

  • PS:當設置的時間限制和內存限制過小,會出現參數錯誤而致使設限失敗,而若是內存限制小於進程須要的內存空間時,會出現應用程序錯誤   orm

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

相關文章
相關標籤/搜索