主进程退出的时候,杀死所有子进程

Posted 小小猫钓小小鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主进程退出的时候,杀死所有子进程相关的知识,希望对你有一定的参考价值。

一、问题背景

    大家可能会遇到这样一种情况,自己编写代码的时候,主进程可能会创建很多子进程,但是此时主进程可能由于某种原因自己崩溃,或者认为通过任务管理器结束掉,这时候子进程可能就会依旧存在。下面介绍一种方法可以让到主进程无论什么原因是掉以后子进程也跟着被杀死。

 

二、技术点

    其实也很简单,就是使用一个job内核对象。

 

三、代码

 

 

[cpp] view plain copy
 
 技术分享技术分享
  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. }  

 

以上是关于主进程退出的时候,杀死所有子进程的主要内容,如果未能解决你的问题,请参考以下文章

创建一个不是创建进程子进程的新进程

主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程

golang 热重启

主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程

关于wait 和 exit

Android可以彻底杀死一个进程吗