我有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
在完成任务之前使用C.exe
为ShellExecute()
创建了一个流程。
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;
用于创建作业对象。
答案 0 :(得分:0)
需要使用附加标志JOB_OBJECT_LIMIT_BREAKAWAY_OK创建作业对象,以允许在作业对象之外创建子进程。
/* @flow */
import * as React from 'react';
class A extends React.Component<*> {
node: ?HTMLElement;
stuff: ?{
style: Object
};
constructor(props) {
super(props);
this.stuff = { style: { foo: 'bar'} };
}
compute(n: number): string {
return n > 0 ? 'something' : '';
}
render() {
if (this.node) {
this.node.style.transform = 'this one is ok';
// got error
this.node.style.transform = this.compute(1);
}
if (this.stuff) {
this.stuff.style.thing = 'this one is ok too';
// numbers are ok too
this.stuff.style.thing = 1;
// got error
this.stuff.style.thing = this.compute(1);
// got error
this.stuff.style.thing = { some: 'object' };
}
return (
<div ref={r => {this.node = r;}}>nonsense</div>
);
}
}
然后使用
jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE|JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION|JOB_OBJECT_LIMIT_BREAKAWAY_OK;
根据#Remy Lebeau的建议,需要使用CREATE_BREAKAWAY_FROM_JOB创建触发C.exe的子进程,以在作业之外启动该进程。
shellexecute()
然后避免使用手柄泄漏
CreateProcess(NULL,"C.exe",NULL,NULL,NULL,NORMAL_PRIORITY_CLASS|CREATE_BREAKAWAY_FROM_JOB|CREATE_SUSPENDED,NULL,NULL,&startupInfo,&processInformation);