一、问题背景

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


二、技术点

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


三、代码



[cpp]​view plain​​​ ​​copy​​​ ​​​​​​​


  1. #include <Windows.h>


  2. int main(int argc, char* argv[])
  3. {
  4. STARTUPINFOA Sinfo;
  5. PROCESS_INFORMATION pi;
  6. ZeroMemory(&Sinfo, sizeof(Sinfo));
  7. Sinfo.cb = sizeof(Sinfo);
  8. ZeroMemory(&pi, sizeof(pi));

  9. BOOL retVal = CreateProcessA("C:\\Windows\\SysWOW64\\notepad.exe",
  10. "", NULL, NULL, FALSE,
  11. 0,
  12. NULL, NULL, &Sinfo, &pi);

  13. //创建一个job内核对象
  14. HANDLE hd = CreateJobObjectA(NULL, "HelloWrold");

  15. if (hd)
  16. {
  17. //设置job内核对象限制条件为:当job对象关闭的时候,关闭其所有子进程
  18. JOBOBJECT_EXTENDED_LIMIT_INFORMATION extLimitInfo;
  19. extLimitInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
  20. retVal = SetInformationJobObject(hd,
  21. JobObjectExtendedLimitInformation,
  22. &extLimitInfo,
  23. sizeof(extLimitInfo));

  24. if (retVal)
  25. {
  26. //将进程加入到job容器中去。
  27. if (pi.hProcess)
  28. {
  29. retVal = AssignProcessToJobObject(hd, pi.hProcess);
  30. }
  31. }
  32. }

  33. Sleep(10000);
  34. return 0;
  35. }