首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作业对象上的CloseHandle(),但不杀死由ShellExecute创建的进程

作业对象上的CloseHandle(),但不杀死由ShellExecute创建的进程
EN

Stack Overflow用户
提问于 2018-07-30 06:41:16
回答 1查看 358关注 0票数 0

我有3个应用程序,A.exeB.exeC.exe

A.exe使用以下代码创建作业对象:

代码语言:javascript
复制
CreateJobObject( NULL, NULL);

然后使用以下代码创建一个进程:

代码语言:javascript
复制
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

更新:我使用过的

代码语言:javascript
复制
jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE|JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION; 

用于创建作业对象。

EN

回答 1

Stack Overflow用户

发布于 2018-08-01 06:39:54

作业对象需要使用附加标志JOB_OBJECT_LIMIT_BREAKAWAY_OK创建,以便允许在作业对象之外创建子进程。

代码语言:javascript
复制
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);

然后,为了避免使用手柄泄漏

代码语言:javascript
复制
CloseHandle(processInformation.hProcess);
CloseHandle(processInformation.hThread);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51588296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档