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

时间:2013-07-12 20:31:28

标签: winapi process

确保在父级被杀死时子进程被杀死的推荐方法是将它们放在Job对象中。但是,如果父进程在对CreateProcess和AssignProcessToJobObject的调用之间死亡,则子进程仍然存在。我怎样才能消除这种竞争条件?

2 个答案:

答案 0 :(得分:1)

您可以使用CREATE_SUSPENDED作为dwCreationFlags CreateProcess参数的标记之一。

MSDN reference here

然后,在调用PROCESS_INFORMATION后,使用ResumeThread结构中返回的线程句柄调用AssignProcessToJobObject

没有错误处理的伪代码:

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

答案 1 :(得分:1)

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

  • master创建命名事件Z
  • master启动奴隶进程
  • slave进程打开命名事件并等待发出信号的状态
  • 主进程执行作业对象的事情
  • 主流程设置事件Z
  • slave对象看到事件Z set并继续执行它应该做的事情,或者超时(如果主进程在将slave进程分配给job对象之前死掉)立即退出