您的位置:首页 > 编程语言 > C语言/C++

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

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

遇到一个需求,需要监测父进程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萫
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多进程 进程管理 C++