您的位置:首页 > 其它

如何等待进程树结束

2014-03-18 09:28 302 查看
我们通常使用的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对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: