winapi - ¿Cómo puede un proceso Win32 obtener el pid de su padre?
process (5)
"Alternativamente, ¿alguien puede aliviar mi temor de que el pid que paso pueda pertenecer a otro proceso después de un tiempo si el padre ha muerto?"
Sí, el PID se puede reutilizar. A diferencia de UNIX, Windows no mantiene un árbol de relaciones padre-hijo fuerte.
Actualmente estoy pasando el pid en la línea de comando para el niño, pero ¿hay alguna manera de hacer esto en la API de Win32? Alternativamente, ¿alguien puede aliviar mi temor de que el pid que paso pueda pertenecer a otro proceso después de un tiempo si el padre ha muerto?
En caso de que alguien más se encuentre con esta pregunta y esté buscando una muestra de código, tuve que hacer esto recientemente para un proyecto de biblioteca de Python en el que estoy trabajando. Aquí está el código de prueba / muestra que se me ocurrió:
#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);
}
Tenga en cuenta que si el proceso principal finaliza, es muy posible e incluso probable que el PID se reutilice para otro proceso. Esta es una operación estándar de Windows.
Entonces, para estar seguro, una vez que reciba la identificación del padre y esté seguro de que realmente es su padre, debe abrirle un identificador y usar eso.
Una mejor forma de hacerlo es llamar a DuplicateHandle()
para crear un duplicado heredable de su identificador de proceso. A continuación, cree el proceso secundario y pase el valor del controlador en la línea de comando. Close
el identificador duplicado en el proceso principal. Cuando el niño haya terminado, también tendrá que Close
su copia.
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;
}