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

    xiaoxiao2021-03-25  112

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

    遇到一个需求,需要监测父进程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萫

    转载请注明原文地址: https://ju.6miu.com/read-9089.html

    最新回复(0)