主進程退出的時候,殺死所有子進程


一、問題背景

    大家可能會遇到這樣一種情況,自己編寫代碼的時候,主進程可能會創建很多子進程,但是此時主進程可能由於某種原因自己崩潰,或者認為通過任務管理器結束掉,這時候子進程可能就會依舊存在。下面介紹一種方法可以讓到主進程無論什么原因是掉以后子進程也跟着被殺死。

 

二、技術點

    其實也很簡單,就是使用一個job內核對象。

 

三、代碼

 

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. #include <Windows.h>  
  2.   
  3.   
  4. int main(int argc, char* argv[])  
  5. {  
  6.     STARTUPINFOA Sinfo;  
  7.     PROCESS_INFORMATION pi;  
  8.     ZeroMemory(&Sinfo, sizeof(Sinfo));  
  9.     Sinfo.cb = sizeof(Sinfo);  
  10.     ZeroMemory(&pi, sizeof(pi));  
  11.   
  12.     BOOL retVal = CreateProcessA("C:\\Windows\\SysWOW64\\notepad.exe",  
  13.         "", NULL, NULL, FALSE,  
  14.         0,  
  15.         NULL, NULL, &Sinfo, &pi);  
  16.   
  17.     //創建一個job內核對象  
  18.     HANDLE hd = CreateJobObjectA(NULL, "HelloWrold");  
  19.   
  20.     if (hd)  
  21.     {  
  22.         //設置job內核對象限制條件為:當job對象關閉的時候,關閉其所有子進程  
  23.         JOBOBJECT_EXTENDED_LIMIT_INFORMATION extLimitInfo;  
  24.         extLimitInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;  
  25.          retVal = SetInformationJobObject(hd,  
  26.             JobObjectExtendedLimitInformation,  
  27.             &extLimitInfo,  
  28.             sizeof(extLimitInfo));  
  29.   
  30.         if (retVal)  
  31.         {  
  32.             //將進程加入到job容器中去。  
  33.             if (pi.hProcess)  
  34.             {  
  35.                 retVal = AssignProcessToJobObject(hd, pi.hProcess);  
  36.             }  
  37.         }  
  38.     }  
  39.   
  40.     Sleep(10000);  
  41.     return 0;  
  42. }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM