Fre*_*abe 7 c++ windows winapi
我正在开发一个函数,它可以获取给定PID的父进程的PID.该功能的原型是
DWORD getParentPid( DWORD pid );
Run Code Online (Sandbox Code Playgroud)
为此,我正在使用CreateToolhelp32Snapshot
函数(和相关函数)来获取PROCESSENTRY32
给定PID 的结构pid
.然后我可以使用th32ParentProcessId
结构的字段来获取创建我给定进程的进程的PID.
但是,由于父进程可能已经被破坏(并且它的PID可能已被Windows重用),我正在使用该GetProcessTimes
函数来获取假定的父进程和子进程的创建时间,然后比较那些使用的进程CompareFileTime
.
如果CompareFileTime
返回-1
,我知道具有父ID的进程是在我的子进程之前创建的,所以它确实是父进程.否则,它显然是一个重用的ID - 并且父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_SNAPPPROCESS,该选项表示它捕获所有进程。然后,一旦获得快照(如示例中所示),您就可以按照快照中存在的方式遍历进程。父 ID 在快照中应该是有效的,因为您正在查看所有进程的状态,因为它们在拍摄快照时存在。您不必担心流程开始时间比较的问题。
归档时间: |
|
查看次数: |
1670 次 |
最近记录: |