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

一、问题背景

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

二、技术点

其实也很简单,就是使用一个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. }
时间: 2024-08-28 21:57:11

主进程退出的时候,杀死所有子进程的相关文章

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

在Python中,由于全局解释器锁GIL的存在,使得Python中的多线程并不能大大提高程序的运行效率(这里单指CPU密集型),那么在处理CPU密集型计算时,多用多进程模型来处理,而Python标准库中提供了multiprocessing库来支持多进程模型的编程.multiprocessing中提供了的Process类用于开发人员编写创建子进程,接口类似于标准库提供的threading.Thread类,还提供了进程池Pool类,减少进程创建和销毁带来开销,用以提高复用(见前文). 在多线程模型中

总结一个主进程启动子进程,删除主进程文件和目录的问题

首先,我们启动子进程的时候,要修改子进程的工作目录. ProcessStartInfo pi = new ProcessStartInfo(fileName, arguments) { WorkingDirectory = Path.GetTempPath() }; pp.StartInfo = pi; pp.Start(); 这里我把工作目录随便指定了一个地方,目的是防止子进程默认继承了主进程的工作目录.如果你省了这一个地方,只要子进程开着,那它的工作目录就和主进程的工作目录是一样的,结局就是

记一次WinForm程序中主进程打开子进程并传递参数的操作过程(进程间传递参数)

目标:想在WinForm程序之间传递参数.以便子进程作出相应的处理. 一种错误的方法 父进程的主程序: 1 ProcessStartInfo psi = new ProcessStartInfo(); 2 psi.FileName = "ProcessChild.exe"; 3 psi.Arguments = txtArgs.Text; 4 Process.Start(psi);//主要问题在这里 子进程的主程序: 1 txtArgs.Text = Process.GetCurrent

主进程或者主线程是否会等待子线程或子进程的问题

1.主进程会等待所有子进程结束后才会程序结束 2.主线程也会等待所有子线程结束后才会主线程结束 3.from multiprocessing import Pool这个进程池,并不会等待所有的进程运行完成,而是主线程代码执行完成后程序就立即结束 . 所以这个进程池需要加p.close()和p.join() 4.from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor  的进程池和线程池,主进程或者主线程会等进程池内

Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四))

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别和联系 _exit是linux系统调用,关闭所有文件描述符,然后退出进程. exit是c语言的库函数,他最

Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四)

Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别和联系 _exit是linux系统调用,关闭所有文件描述符,然后退出进程. exit是c语言的库函数,他最终调用_exit.在此之前,先清洗标准输出的缓存,调用用atexit注册的函数等, 在c语言的main函数中调用return就等价于调用exit. _Exit是c语言的库函数,自c99后加入,等

转载:进程退出状态--waitpid status意义

最近遇到一个进程突然退出的问题,由于没有注册signalhandler所以没有捕捉到任何信号. 但是从log中看到init waitpid返回的status为0x008b,以前对status不是很了解,下面的文章对status有比较全面的介绍. 转至http://tsecer.blog.163.com/blog/static/15018172012323975152/ 一.和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitX

如何用supervisor守护php-fpm主进程以实现php-fpm的自动重启

最近有同事有个针对php-fpm进程的监护需求,也即:如果php-fpm的master进程意外退出(可能是crash,也可能是被误kill),那么希望master进程能被自动拉起,以免中断服务. 我们知道,supervisor是一个非常强大的进程监控(monitor & control)工具,它理论上可以实现php-fpm master进程的守护需求.因此,我帮同事试验了如何用supervisor完成他的需求,结果表明,supervisor确实是神器,只需一个合理的配置文件,它就能解决问题. 下

一个主进程卡死的跟踪

原因:一开始想查找由于ipc初始化顺序的问题导致tray卡死的原因,但恰好遇到主进程弹出退出确认框后也卡死了,于是开始查找原因. 首先是跟踪代码,发现消息循环是活着的,但整个消息循环只能取到timer和paint消息,使用消息工具抓窗口,可以看到也可以取到GetItemText等消息. (一般来讲这时已经可以定位是由于attachthreadinput的原因了,但这时候我还不知道); 仔细想,最可能的情况就是当前线程所有窗口都已经被disable掉了,于是仔细检查进程的所有窗口,没有发现问题.