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

时间:2008-10-08 22:56:10

标签: winapi process

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

5 个答案:

答案 0 :(得分:50)

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

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

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);
}

答案 1 :(得分:20)

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

答案 2 :(得分:19)

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;
}

答案 3 :(得分:10)

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

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

答案 4 :(得分:2)

  

“或者,有人可以减轻我对我正在经过的pid的恐惧   如果父母有一段时间,可能属于另一个进程   死?“

是的,PID可以重复使用。与UNIX不同,Windows不维护强大的父子关系树。