我正在为一个给定的PID获取父进程的PID的函数。 function的原型是
DWORD getParentPid( DWORD pid );
为此,我使用CreateToolhelp32Snapshot
函数(和相关函数)来获取给定PID PID的PROCESSENTRY32
结构。 然后,我可以使用该结构的th32ParentProcessId
字段来获取创build我的给定进程的进程的PID。
但是,由于父进程可能已经被销毁(并且它的PID可能已被Windows重用),所以我使用GetProcessTimes
函数来获取所谓父进程和subprocess的创build时间,然后使用CompareFileTime
进行比较。
如果CompareFileTime
返回-1
,我知道具有父ID的进程是在我的subprocess之前创build的,所以它确实是父进程。 否则,这显然是一个重用的ID – 而且父PID是无效的(它不再引用原来的父母)。
问题在于它非常依赖严格单调的系统时钟和GetProcessTimes
的粒度。 我确实经历了CompareFileTime
返回0
(意思是“平等的时间”),即使被考虑的过程确实是父子关系。 我可以改变我的检查,以便一个CompareFileTime
结果值<= 0
将被视为指示一个父,但是,然后我会打破(理论)的情况下,父母创build一个subprocess,然后父母被销毁,然后Windows重新- 使用PID – 全部在100ns内(这是GetProcessTimes
的分辨率)。
我想知道是否有一种不同的,更可靠的机制来validation某个进程确实是C ++中另一个进程的父进程?
编辑:我需要这个function,以确定所有的subprocess(这意味着包括孙subprocess)。 CreateToolhelp32Snapshot
允许我遍历所有进程,但是我需要查看每个进程的父PID,以确定它是否是我的进程的subprocess。
这里的示例:
http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85).aspx
显示为processId调用CreateToolhelp32Snapshot参数为0,它使用选项TH32CS_SNAPPROCESS它说它捕获所有进程。 然后,一旦获得了快照,就像在示例中一样,您可以像快照中存在的那样走过程。 父代码在快照中应该是有效的,因为您正在查看所有进程的状态,因为它们是在创建快照时的单一时刻存在的。 你不必为你的流程开始时间比较而烦恼。
如果在您的应用程序运行时创建了这个进程,那么您可以重复遍历它,并重复使用PID。