我有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; 用于创建作业对象。
发布于 2018-08-01 06:39:54
作业对象需要使用附加标志JOB_OBJECT_LIMIT_BREAKAWAY_OK创建,以便允许在作业对象之外创建子进程。
jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE|JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION|JOB_OBJECT_LIMIT_BREAKAWAY_OK;然后使用
shellexecute()
触发C.exe的子进程需要按照#Remy的建议使用CREATE_BREAKAWAY_FROM_JOB创建,以启动作业之外的进程。
CreateProcess(NULL,"C.exe",NULL,NULL,NULL,NORMAL_PRIORITY_CLASS|CREATE_BREAKAWAY_FROM_JOB|CREATE_SUSPENDED,NULL,NULL,&startupInfo,&processInformation);
然后,为了避免使用手柄泄漏
CloseHandle(processInformation.hProcess);
CloseHandle(processInformation.hThread);https://stackoverflow.com/questions/51588296
复制相似问题