如何在C++中可靠地检查一个Windows进程是否是另一个进程的父进程
How can I reliably check whether one Windows process is the parent of another in C++?
我正在处理一个函数,该函数为我获取给定PID的父进程的PID。该功能的原型是
DWORD getParentPid( DWORD pid );
为此,我使用CreateToolhelp32Snapshot
函数(以及相关函数(来获得给定PID pid
的PROCESSENTRY32
结构。然后,我可以使用结构的th32ParentProcessId
字段来获得创建给定进程的进程的PID。
然而,由于父进程可能已经被破坏(它的PID可能已经被Windows重用(,我使用GetProcessTimes
函数来获取假定的父进程和子进程的创建时间,然后使用CompareFileTime
进行比较。
如果CompareFileTime
返回-1
,我知道具有父ID的进程是在我的子进程之前创建的,所以它确实是父进程。否则,它显然是一个重复使用的ID,并且父PID无效(它不再引用原始父PID(。
这样做的问题是,它在很大程度上依赖于严格单调的系统时钟和GetProcessTimes
的粒度。我确实经历过CompareFileTime
返回0
(意思是"相等的时间"(的情况,尽管所考虑的过程确实是父子关系。我可以更改我的检查,以便CompareFileTime
结果值<= 0
将被视为指示父进程,但随后我将打破(理论(情况,即父进程创建了一个子进程,然后父进程被销毁,然后Windows重新使用PID-所有这些都在100ns内(这是GetProcessTimes
的分辨率(。
我想知道,在C++中,是否有一种不同的、更可靠的机制来验证某个进程确实是另一个进程的父进程?
编辑:我需要这个函数来确定所有子进程(这意味着包括子进程(。CreateToolhelp32Snapshot
允许我迭代所有进程,但我需要查看每个进程的父PID,以判断它是否是我手头进程的子进程。
此处的示例:
http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85(.aspx
显示使用processId的参数0调用CreateToolhelp32Snapshot,并使用选项TH32CS_SNAPPROCESS,该选项表示它捕获所有进程。然后,一旦您获得了快照,就像在示例中一样,您就可以遍历快照中存在的进程。父id在快照中应该是有效的,因为您查看的是所有进程在拍摄快照时的状态。你不必为你的流程开始时间比较而烦恼。
如果进程是在应用程序运行时创建的,那么您可以随着时间的推移反复迭代它,并捕获PID重用。
- Windows 进程间同步类似事件?
- 为什么 Windows 拒绝访问某些进程的名称?
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 在 Windows/C++ 上使用多进程应用程序的高精度定时操作
- Windows 将标准的 C 文件结构注入到正在运行的进程中
- Windows 上的进程资源限制
- C++ Windows:从主进程和 CallWndProc 进程访问相同的变量
- 如何:监视Windows中另一个进程的文件访问?
- 如何在Windows上通过QProcess启动提升的子进程?
- C++ Windows 返回与退出进程
- 如何在 Windows 进程回调中断开连接时获取设备信息(硬件 ID)
- 可以从外部进程[C /Windows]移动/调整Windows
- 将特定的逻辑内核专门分配给特定进程,即 Windows、C++
- 如何使用 C# 在 Windows 中获取另一个进程库地址
- 如何从Windows中的进程中读取Unicode字符串
- 将 Windows 10 中的特定进程更改为高优先级
- 如何使用Windows API直接将进程"assign"到信号量?
- 子进程 c++ 的 Windows 控制台信号处理
- Windows资源监视器使用哪些Win32函数来检测已终止进程的磁盘和网络活动
- 如何获取特定进程 (Windows 7) 使用的所有 API 的列表