进程管理:通过父进程ID获取子进程ID

  为了提高效率,充分利用资源,需要采用多线程,多进程的设计。在网络通信程序中,无论是客户端,还是服务端,功能稍微扩展一下,基本上不可避免的要使用多线程,多进程。

遇到一个需求,需要监测父进程A(Process A) ,创建的子进程B (Process B)。


其中 Process A是主程序Process Main创建的,在创建的时候可以获取Process A 的ID,因此把Process A的ID为父进程ID,来匹配子进程ID


先上代码

DWORD GetProceeIDfromParentID(DWORD &dwParentProcessId)
{

	DWORD dwProcessID =0; 

	//进行一个进程快照
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	if (hProcessSnap == INVALID_HANDLE_VALUE)
	{
		
		LOG(INFO) << _T("进程快照失败");
		return FALSE;
	}

	PROCESSENTRY32 pe;
	TCHAR procID[100] ={0};
	string strTemp;
	pe.dwSize = sizeof(pe);
	BOOL bProcess = Process32First(hProcessSnap,&pe);
	
	strTemp =to_string(dwParentProcessId);
	LOG(INFO) << _T(" The parent procees ID : ") << dwParentProcessId;
	while (bProcess)
	{


		LOG(INFO) << _T(" The local procees ID major: ") << pe.th32ProcessID;
		LOG(INFO) << _T(" The parent procees ID major: : ") << pe.th32ParentProcessID;

		if (pe.th32ParentProcessID == dwParentProcessId)
		{

			dwProcessID = pe.th32ProcessID;
			LOG(INFO) << _T(" The son procees ID : ") << pe.th32ProcessID;
			LOG(INFO) << _T(" The parent procees ID A : ") << pe.th32ParentProcessID;
			LOG(INFO) << _T(" The parent procees ID B: ") << dwParentProcessId;
		}


		bProcess = Process32Next(hProcessSnap,&pe);
	}

	CloseHandle(hProcessSnap);

	return dwProcessID;
}

有三个关键性的函数   CreateToolhelp32Snapshot() ,  Process32First() , Process32Next()

1、 CreateToolhelp32Snapshot()  为当前时刻的线程,进程,模块创建一个快照,意味着获取当前所有线程进程的信息


2、Process32First() 获取第一个(列表头部)进程的信息,一般需要和 Process32Next() 配合使用

3、Process32Next()获取下一个进程信息,轮询列表,那么可以获取完整列表


其中LOG是用来输出日志的,调试使用的log类为 Easylogging++ easylogging++


参考文章:通过进程名称获取进程ID、通过子进程ID获取其父进程ID及通过进程ID获取进程名称

感谢 博主 Lemon萫

猜你喜欢

转载自blog.csdn.net/starelegant/article/details/60955290