Como um processo do Win32 pode obter o pid de seu pai?

Atualmente estou passando o pid na linha de comando para o filho, mas existe uma maneira de fazer isso na API do Win32? Alternativamente, alguém pode aliviar meu medo de que o pid que estou passando possa pertencer a outro processo depois de algum tempo se o pai morreu?

Observe que, se o processo pai terminar, é muito possível e até mesmo provável que o PID seja reutilizado para outro processo. Esta é a operação padrão do Windows.

Então, para ter certeza, uma vez que você recebe o id do pai e tem certeza que é realmente seu pai, você deve abrir um identificador para ele e usar isso.

Apenas no caso de alguém mais se deparar com essa questão e estiver procurando por um exemplo de código, eu tive que fazer isso recentemente para um projeto de biblioteca Python em que estou trabalhando. Aqui está o código de teste / amostra que eu criei:

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

Uma maneira melhor de fazer isso é chamar DuplicateHandle() para criar uma duplicata herdável do identificador do processo. Em seguida, crie o processo filho e passe o valor do identificador na linha de comando. Close o identificador duplicado no processo pai. Quando a criança terminar, precisará Close sua cópia também.

“Alternativamente, alguém pode aliviar meu medo de que o pid que estou passando possa pertencer a outro processo depois de algum tempo se o pai morreu?”

Sim, o PID pode ser reutilizado. Ao contrário do UNIX, o Windows não mantém uma tree forte de relacionamento pai-filho.