当前位置:  开发笔记 > 编程语言 > 正文

Win32进程如何获得其父进程的pid?

如何解决《Win32进程如何获得其父进程的pid?》经验,为你挑选了4个好方法。

我正在将命令行上的pid传递给子进程,但有没有办法在Win32 API中执行此操作?或者,有人可以减轻我的担心,如果父母已经去世,我经过的pid可能会在一段时间后属于另一个过程吗?



1> Jay..:

为了防止其他人遇到这个问题并且正在寻找代码示例,我最近必须为我正在研究的Python库项目执行此操作.这是我提出的测试/示例代码:

#include 
#include 
#include 

int main(int argc, char *argv[]) 
{
    int pid = -1;
    HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);

    //assume first arg is the PID to get the PPID for, or use own PID
    if (argc > 1) {
        pid = atoi(argv[1]);
    } else {
        pid = GetCurrentProcessId();
    }

    if( Process32First(h, &pe)) {
        do {
            if (pe.th32ProcessID == pid) {
                printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);
            }
        } while( Process32Next(h, &pe));
    }

    CloseHandle(h);
}


代码示例为+1000000.Dunno最近遇到了stackoverflow,但我厌倦了在编程网站上浏览几十页而没有看到任何代码.

2> Peter Ruderm..:

更好的方法是调用DuplicateHandle()创建进程句柄的可继承副本.然后创建子进程并在命令行上传递句柄值. Close父进程中的重复句柄.当孩子完成后,它也需要Close复制.


此方法的优点是,即使父级在您访问之前死亡,句柄也会真正引用您的父级.使用pid传递方法,传递pid,访问它的子进程,父进程关闭以及pid被重用之间可能存在竞争条件(尽管非常不可能)......
澄清一下:通常你会*重复*或*继承一个句柄.但是,在这种情况下,你所拥有的只是从GetCurrentProcess()返回的伪句柄,它不能被继承.所以你必须复制它才能生成一个真正的,可继承的句柄.使用继承的原因是,如果将句柄直接复制到子进程,则没有简单的方法告诉子进程句柄值是什么.

3> 小智..:
ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K
{
 ULONG_PTR pbi[6];
 ULONG ulSize = 0;
 LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
  PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength); 
 *(FARPROC *)&NtQueryInformationProcess = 
  GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
 if(NtQueryInformationProcess){
  if(NtQueryInformationProcess(GetCurrentProcess(), 0,
    &pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
     return pbi[5];
 }
 return (ULONG_PTR)-1;
}


在使用[NtQueryInformationProcess](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280.aspx)之前,请注意它是一个不受支持的API,我引用链接:"NtQueryInformationProcess may在未来版本的Windows中被更改或不可用." 此外,即使在文档中,父进程ID字段也是保留字段.

4> shoosh..:

请注意,如果父进程终止,则很可能甚至可能将PID重用于另一个进程.这是标准的Windows操作.

所以可以肯定的是,一旦你收到父母的id,并确定它真的是你的父母,你应该打开它的句柄并使用它.


通过另外检查开始时间可以检测重用的PID.真正的父母将在孩子之前有一个开始时间,一个重复使用的孩子 - 之后.
推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有