如何等待进程树结束
2014-03-18 09:28
302 查看
我们通常使用的WaitForSingleObject只能等待一个进程结束,如果进程中间又发起了另外一个进程,我们如何知道那个进程结束?
其实,Windows平台上有Job Objects,可以对进程进行分组管理。只要把一个进程指定给一个Job,其子进程也会自动归属该Job,除非主动脱离。这样,我们就可以通过Job来跟踪整个的进程树了。
示例代码:
你可以在CMD窗口里启动任何的程序,比如notepad.exe,然后在open对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。
其实,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对话框里使用右键菜单打开其它文件,程序.....如此循环,上面的代码会等待所有程序退出才会结束。
相关文章推荐
- delphi 如何等待进程树的结束
- 我在delphi中用shellExecute启动了一个程序(ftp);然后想做一个等待,只到ftp进程结束,再继续下面的操作,请问如何监控这个进程是否已结束?
- 如何等待进程树结束
- delphi 如何等待进程树的结束
- 在VC中如何结束进程和启动新进程
- linux 如何结束进程
- shell命令管道未读完阻塞了子进程,与等待其结束的父进程死"锁"。
- Linux 等待进程结束 wait() 和 waitpid()
- NSIS如何在安装前结束当前运行的进程
- 【经典转载】Linux进程学习系列之五 等待进程结束wait()和waitpid()函数
- java 如何结束掉一个不再需要的进程
- 演示等待通过CreateProcess创建的进程结束
- linux 如何结束进程
- 如何用dos命令结束进程
- 关于.NET程序中使用Excel对象后,如何结束残留的Excel进程
- 关于.NET程序中使用Excel对象后,如何结束残留的Excel进程。
- 如何枚举并结束指定的进程?--Process类
- 如何用dos命令结束进程
- VC++ 系统服务如何让服务进程结束后依赖windows自身把服务重启
- Delphi写的等待进程运行结束函数