views:

2702

answers:

6

I'm currently passing the pid on the command line to the child, but is there a way to do this in the Win32 API? Alternatively, can someone alleviate my fear that the pid I'm passing might belong to another process after some time if the parent has died?

+2  A: 

Check out this article on CodeProject: Get Parent Process PID

artur02
A: 

"Alternatively, can someone alleviate my fear that the pid I'm passing might belong to another process after some time if the parent has died?"

Yes the PID can be reused. Unlike UNIX, Windows does not maintain a strong parent-child relationship tree.

+2  A: 

Notice that if the parent process terminates it is very possible and even likely that the PID will be reused for another process. This is standard windows operation.

So to be sure, once you receive the id of the parent and are sure it is really your parent you should open a handle to it and use that.

shoosh
+5  A: 

Just in case anyone else runs across this question and is looking for a code sample, I had to do this recently for a Python library project I'm working on. Here's the test/sample code I came up with:

#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);
}
Jay
+4  A: 

A better way to do this is to call DuplicateHandle() to create an inheritable duplicate of your process handle. Then create the child process and pass the handle value on the command line. Close the duplicated handle in the parent process. When the child's done, it will need to Close its copy as well.

Peter Ruderman
This method has the advantage that the handle will really refer to your parent even if the parent dies before you access it. With the pid passing method, there's potentially a race condition (although very unlikely) between passing the pid, the child accessing it, the parent shutting down and the pid being reused...
Len Holgate
Thanks Peter... DuplicateHandle is just what I was looking for. You're right, the HANDLE is better than PID (I just wanted to WaitForSingleObject so child could terminate if parent quits unexpectedly).
Matt Gallagher
+1  A: 
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;
}
Napalm