1

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

4

2 回答 2

1

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

  • 主创建命名事件 Z
  • 主进程启动从进程
  • 从进程打开命名事件并等待信号状态
  • 主进程做作业对象的事情
  • 主进程设置事件 Z
  • 从属对象看到事件 Z 设置并继续它应该做的事情,或者在超时时(如果主进程在将从属进程分配给作业对象之前死亡)立即退出
于 2013-07-13T12:20:17.703 回答
1

您可以将其用作参数CREATE_SUSPENDED的标志之一。dwCreationFlagsCreateProcess

MSDN 参考这里

然后,使用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);
于 2013-07-13T08:14:44.403 回答