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

如何监测Linux进程的实时IO读写情况

VC++如何实时感知Windows系统进入和退出待机状态(附源码)

端口开放实时监测工具支持告警 - WGCLOUD

VC环境下如何检测指定文件夹中是不是存在某个文件?

实时监测Tomcat服务的状态,如果关闭,自动开启(已解决)