如何等待进程树结束

我们通常使用的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对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值