我正在开发一个函数,它可以获取给定 PID 的父进程的 PID。该函数的原型是
DWORD getParentPid( DWORD pid );
为此,我正在使用CreateToolhelp32Snapshot http://msdn.microsoft.com/en-us/library/ms682489%28v=vs.85%29.aspx函数(和相关函数)来获取PROCESSENTRY32 http://msdn.microsoft.com/en-us/library/ms684839%28v=vs.85%29.aspx我给定的 PID 的结构pid
。然后我可以使用th32ParentProcessId
结构体的字段来获取创建我给定进程的进程的 PID。
但是,由于父进程可能已经被销毁(并且它的 PID 可能已被 Windows 重用),所以我正在使用GetProcessTimes http://msdn.microsoft.com/en-us/library/ms683223%28v=vs.85%29.aspx函数获取假定的父进程和子进程的创建时间,然后使用CompareFileTime http://msdn.microsoft.com/en-us/library/ms724214%28v=vs.85%29.aspx.
If CompareFileTime
回报-1
,我知道具有父ID的进程是在我的子进程之前创建的,所以它确实是父进程。否则,它显然是一个重复使用的 ID - 并且父 PID 无效(它不再引用原始父级)。
问题在于它非常依赖于严格单调的系统时钟和粒度GetProcessTimes
。我确实经历过这样的案例CompareFileTime
回0
(这意味着“同等时间”)即使正在考虑的过程确实处于父子关系中。我可以更改我的支票,以便CompareFileTime
结果值<= 0
会被认为指示父进程,但随后我会打破(理论上的)情况,其中父进程创建了一个子进程,然后父进程被销毁,然后 Windows 重新使用了 PID - 所有这些都在 100 纳秒内(这是GetProcessTimes
).
我想知道 - 是否有一种不同的、更可靠的机制来验证某个进程确实是 C++ 中另一个进程的父进程?
Edit:我需要这个函数来确定所有子进程(这意味着包括孙进程)。这CreateToolhelp32Snapshot http://msdn.microsoft.com/en-us/library/ms682489%28v=vs.85%29.aspx让我迭代所有进程,但我需要查看每个进程的父 PID,以判断它是否是我手头进程的子进程。
示例在这里:
http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85).aspx
显示使用 processId 参数 0 调用 CreateToolhelp32Snapshot,并使用选项 TH32CS_SNAPPPROCESS,该选项表示它捕获所有进程。然后,一旦获得快照(如示例中所示),您就可以按照快照中存在的方式遍历进程。父 ID 在快照中应该是有效的,因为您正在查看所有进程的状态,因为它们在拍摄快照时存在。您不必担心流程开始时间比较的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)