VC++如何实时监测另一个进程是否已经退出?(附源码)
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++如何实时监测另一个进程是否已经退出?(附源码)相关的知识,希望对你有一定的参考价值。
在主程序运行的过程中启动了一个子进程,有时主进程要等待子进程退出后再执行代码,有时子进程需要感知主进程是否已经退出,这两种情况都需要感知另一个进程是否已经退出,那如何才能实时地感知另一个进程已经退出了呢?本文就来讲述一个有效的方法来实现这一诉求。
1、子进程实时感知主进程是否已经退出
主进程在运行过程中启动了一个子进程,启动子进程时将主进程的进程id传给子进程。子进程是依赖于主进程存活的,如果主进程退出了,则子进程要自动退出,所以子进程要实时感知主进程的状态。有人说,主进程可以在退出时通知子进程,子进程收到通知后再自行退出。但主进程可能会发生崩溃或闪退,这种情况下就没有通知子进程的机会了。
那子进程如何才能实时感知到主进程退出了呢?不管是主进程正常退出,还是异常崩溃闪退,都要感知到。子进程可以启动一个子线程,在子线程中通过主进程传过来的主进程id,获取主进程句柄,然后调用WaitForSingleObject等待主进程退出,可以在子线程中无限等待。如果主进程一旦退出,WaitForSingleObject函数就会立即返回,这时子进程就可以调用ExitProcess等接口自行退出进程了。
具体的代码实现是,子进程中启动一个子线程,将主进程传过来的主进程id传给该子线程,如下:(其中MonitorMainProcess是线程函数)
HANDLE hThread = (HANDLE)_beginthreadex( NULL, 0, MonitorMainProcess, (void*)dwMainProcessId, 0, NULL );
if ( hThread != NULL )
CloseHandle( hThread );
线程函数MonitorMainProcess实现如下:
// 监控主工程
unsigned __stdcall MonitorMainProcess(void * pParam )
DWORD dwProcessId = (DWORD)pParam;
HANDLE hProcess = OpenProcess( SYNCHRONIZE, FALSE, dwProcessId );
if(hProcess == NULL)
ExitProcess(-1);
// 设置INFINITE无限等待
WaitForSingleObject( hProcess, INFINITE );
CloseHandle( hProcess );
// WaitForSingleObject返回了,就表示主进程已经退出,直接退出本进程
ExitProcess( -1 );
此处需要注意一下,调用OpenProcess时必须要设置SYNCHRONIZE参数,因为设置该标记参数后才能调用WaitForSingleObject去等待进程。微软MSDN上对SYNCHRONIZE如下:
SYNCHRONIZE:The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.
此外,监测主进程是否退出的代码是阻塞式的,不能放在主线程中的,这就是为什么要启动一个子线程去专门做这个监测任务。
2、启动子进程后等待子进程执行完退出后,再执行后续操作
有时我们需要启动一个子进程去完成某项操作,主进程在等待子进程的执行结果(需要获取子进程的执行数据), 然后主进程再去执行后续操作。主进程在启动子进程后,就可以调用WaitForSingleObject等待子进程退出,比如如下的代码:
// 启动一个子进程去执行一个操作任务
STARTUPINFO s = sizeof(s);
PROCESS_INFORMATION pi = 0;
if( CreateProcess( NULL, cmdLine, NULL, NULL, TRUE, NULL, NULL, NULL, &s, &pi ) )
// 等待进程执行完毕
WaitForSingleObject( pi.hProcess, INFINITE );
// 关闭进程和主线程句柄
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
// ... // 去拿子进程的执行结果,去执行后续操作
以上是关于VC++如何实时监测另一个进程是否已经退出?(附源码)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VC++ 2005 中使用 OpenProcessToken、AdjustTokenPrivileges 和 GetExitCodeProcess