c++ - 如何可靠地检查一个 Windows 进程是否是 C++ 中另一个进程的父进程?

标签 c++ windows winapi

我正在开发一个函数,该函数可为我获取给定 PID 的父进程的 PID。函数原型(prototype)为

DWORD getParentPid( DWORD pid );

为此,我使用了 CreateToolhelp32Snapshot 函数(和相关函数)来获取 PROCESSENTRY32 我给定 PID 的结构 pid .然后我可以使用 th32ParentProcessId结构的字段以获取创建我的给定进程的进程的 PID。

但是,由于父进程可能已经被销毁(并且它的 PID 可能已被 Windows 重用),我正在使用 GetProcessTimes 函数获取假定的父进程和子进程的创建时间,然后使用 CompareFileTime 比较它们.

如果CompareFileTime返回 -1 ,我知 Prop 有父 ID 的进程是在我的子进程之前创建的,所以它确实是父进程。否则,它显然是一个重复使用的 ID - 父 PID 无效(它不再引用原始父 PID)。

问题在于它非常依赖于严格单调的系统时钟和 GetProcessTimes 的粒度.我确实遇到过CompareFileTime的案例返回 0 (这意味着“平等的时间”)即使被考虑的过程确实处于父子关系中。我可以更改我的支票,以便 CompareFileTime结果值 <= 0将被视为指示父进程,但随后我会打破(理论上的)情况,即父进程创建子进程,然后父进程被销毁,然后 Windows 重新使用 PID - 全部在 100ns 内(这是分辨率GetProcessTimes ).

我想知道 - 在 C++ 中是否有一种不同的、更可靠的机制来验证某个进程确实是另一个进程的父进程?

编辑:我需要这个函数来确定所有子进程(这意味着包括孙子进程)。 CreateToolhelp32Snapshot 让我遍历所有进程,但我需要查看每个进程的父 PID,以判断它是否是我手头进程的子进程。

最佳答案

如果进程是在您的应用运行时创建的,您可以随着时间的推移反复迭代它并捕获 PID 重用。

关于c++ - 如何可靠地检查一个 Windows 进程是否是 C++ 中另一个进程的父进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6593003/

相关文章:

c++ - Visual Studio Code : settings. json 系列的 C_Cpp.xxx 配置与 c_cpp_properties.json?

java - 如何在 Java 的 Windows 的一个命令中执行多个命令和 psql 查询?

c++ - 为来自不同进程的窗口设置父级是否正确?

windows - 在重定向的标准输出管道上禁用缓冲(Win32 API、C++)

c++ - 返回带有持久缓冲区的字符串

编译文件时出现 C++ 错误

c++ - 32 位系统上的 UInt64,需要从 UInt32 或字节数组生成,如何?

windows - InnoSetup 在 Mac Parallels 上安装的 Win XP 上找不到 'My Documents'

c++ - Unix 和 Windows 服务器上的 GUI 开发

c++ - 将结构传递给线程