在作业对象上的CloseHandle()但不会终止ShellExecute创建的进程

时间:2018-07-30 06:41:17

标签: c++ createprocess shellexecute

我有3个应用程序,A.exeB.exeC.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.exeShellExecute()创建了一个流程。

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; 

用于创建作业对象。

1 个答案:

答案 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);