В настоящее время я передаю pid в командной строке для дочернего элемента, но есть ли способ сделать это в Win32 API? В качестве альтернативы, может ли кто-то смягчить мой страх, что pid, который я передаю, может принадлежать другому процессу через некоторое время, если родитель умер?
Как процесс Win32 может получить pid своего родителя?
Ответ 1
Обратите внимание, что если родительский процесс завершается, это очень возможно и даже вероятно, что PID будет повторно использован для другого процесса. Это стандартная операция с окнами.
Итак, как только вы получите идентификатор родителя и уверены, что это действительно ваш родитель, вы должны открыть ему дескриптор и использовать его.
Ответ 2
На всякий случай, если кто-то еще сталкивается с этим вопросом и ищет образец кода, мне пришлось сделать это недавно для проекта библиотеки 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);
}
Ответ 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;
}
Ответ 4
Лучший способ сделать это - вызвать DuplicateHandle()
, чтобы создать наследуемый дубликат дескриптора процесса. Затем создайте дочерний процесс и передайте значение дескриптора в командной строке. Close
дублированный дескриптор родительского процесса. Когда ребенок будет сделан, ему также понадобится Close
его копия.
Ответ 5
"Альтернативно, может кто-то смягчить мой страх, что pid, который я передаю могут принадлежать другому процессу через некоторое время, если родитель имеет умер?"
Да, PID можно использовать повторно. В отличие от UNIX, Windows не поддерживает сильное дерево отношений между родителями и дочерними элементами.