如何等待进程树结束

我们通常使用的WaitForSingleObject只能等待一个进程结束,如果进程中间又发起了另外一个进程,我们如何知道那个进程结束?

其实,Windows平台上有 Job Objects,可以对进程进行分组管理。只要把一个进程指定给一个Job,其子进程也会自动归属该Job,除非主动脱离。这样,我们就可以通过Job来跟踪整个的进程树了。

示例代码:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{

 HANDLE job=CreateJobObject(NULL,NULL);

 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 
 ZeroMemory( &si, sizeof(STARTUPINFO) );
 si.cb = sizeof(STARTUPINFO);
 ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );

 CreateProcess(L"C:/WINDOWS/system32/cmd.exe",NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
  
 AssignProcessToJobObject(job,pi.hProcess);
 
 while(true)
 {
  JOBOBJECT_BASIC_PROCESS_ID_LIST list;
  DWORD length;
  QueryInformationJobObject(job,JobObjectBasicProcessIdList,&list,sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST),&length);
 
  if(list.NumberOfProcessIdsInList<=0)
       break;
 
  Sleep(1000);
 }
   
     CloseHandle(job);
 
 std::cout<<"exit"<<std::endl;
 
 std::cin.get();
 
 return 0;
}


你可以在CMD窗口里启动任何的程序,比如notepad.exe,然后在open对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。

你可能感兴趣的:(如何等待进程树结束)