Winapi 避免CreateProcess和AssignProcessToJobObject之间的时间窗口

Winapi 避免CreateProcess和AssignProcessToJobObject之间的时间窗口,winapi,process,Winapi,Process,确保在终止父进程时终止子进程的建议方法是将它们放入作业对象中。但是,如果父进程在调用CreateProcess和AssignProcessToJobObject之间死亡,则子进程将继续存在。如何消除此争用条件?您可以使用CREATE\u SUSPENDED作为CreateProcess的dwCreationFlags参数的标志之一 然后,在调用AssignProcessToJobObject之后,使用PROCESS\u INFORMATION结构中返回的线程句柄调用ResumeThread 无

确保在终止父进程时终止子进程的建议方法是将它们放入作业对象中。但是,如果父进程在调用CreateProcess和AssignProcessToJobObject之间死亡,则子进程将继续存在。如何消除此争用条件?

您可以使用
CREATE\u SUSPENDED
作为
CreateProcess
dwCreationFlags
参数的标志之一

然后,在调用
AssignProcessToJobObject
之后,使用
PROCESS\u INFORMATION
结构中返回的线程句柄调用
ResumeThread

无错误处理的伪代码:

STARTUPINFO startUp;
PROCESS_INFORMATION processInfo;

CreateProcess (NULL, /* whatever */, NULL, NULL, TRUE,
    CREATE_SUSPENDED | CREATE_NEW_PROCESS_GROUP, NULL, NULL, 
    &startUp, &processInfo);

AssignProcessToJobObject(hJobObject, processInfo.hProcess);

ResumeThread (processInfo.hThread);

您可以使用命名事件与从属应用程序同步:

  • master创建命名事件Z
  • 主进程启动从进程
  • 从属进程打开命名事件并等待信号状态
  • 主进程做作业对象的事情
  • 主进程设置事件Z
  • 从属对象看到事件Z集合并继续执行它应该执行的操作,或者在超时时(若主进程在将从属进程分配给作业对象之前死亡),立即退出

在作业对象中捕获子进程之前,您的代码会防止子进程生成更多进程,但如果父进程在AssignProcessToJobObject之前死亡,则子进程会泄漏。我不编写子程序,但另一个答案中提到的CREATE_SUSPENDED与您的事件具有相同的效果。我的问题是,父进程可能会在生成子进程之后和将其添加到作业对象之前死亡。这样,如果主进程在将从属进程添加到作业对象之前死亡,则子进程将立即终止。我现在明白了。这对我来说仍然不起作用,因为我正在为我的孩子调用一个预先存在的exe。我无法按照您的协议重写它。此外,您可能缺少一些内容:。在创建从进程之前,让主对象成为作业对象的成员将强制子进程从一开始就是作业对象的一部分。有时Visual Studio或Windows已将父进程分配给作业。在Windows 8之前,作业无法嵌套,因此子作业不能始终继承父作业。孩子们可能还需要一份有限的工作。