【发布时间】:2018-07-30 06:41:16
【问题描述】:
我有 3 个应用程序,A.exe、B.exe 和 C.exe。
A.exe 使用此代码创建作业对象:
CreateJobObject( NULL, NULL);
然后它使用以下代码创建一个进程:
CreateProcess(NULL,"B.exe",NULL,NULL,NULL,NORMAL_PRIORITY_CLASS|CREATE_BREAKAWAY_FROM_JOB|CREATE_SUSPENDED,NULL,NULL,&startupInfo,&processInformation);
最后,它将进程添加到作业对象中。
B.exe 在完成其任务之前使用ShellExecute() 为C.exe 创建一个进程。
C.exe 预计需要 2-3 分钟才能完成其任务。但是随着B.exe 的完成,不知何故C.exe 也被杀死了。我猜是因为我在作业对象上使用了CloseHandle()。
如何避免在没有句柄泄漏的情况下杀死C.exe?
更新: 我用过
jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE|JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION;
用于创建作业对象。
【问题讨论】:
-
简单地关闭作业句柄不会杀死作业中的活动进程,除非作业通过
SetInformationJobObject()启用了JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE标志。另一种选择是将B.exe改为使用CreateProcess()(无论如何你都应该这样做),这样你就可以使用它的CREATE_BREAKAWAY_FROM_JOB标志。 Read the documentation 了解更多详情。 -
是的,我用过 jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE|JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION;
-
嗯,这是应该包含的重要信息。
标签: c++ createprocess shellexecute