В настоящее время я передаю pid в командной строке дочернему элементу, но есть ли способ сделать это в Win32 API? В качестве альтернативы, может ли кто-нибудь облегчить мой страх, что pid, который я передаю, может принадлежать другому процессу через некоторое время, если родитель умер?
Как процесс Win32 может получить pid своего родителя?
Ответы (5)
Обратите внимание, что если родительский процесс завершится, вполне возможно и даже вероятно, что PID будет повторно использован для другого процесса. Это стандартная операция Windows.
Поэтому, чтобы быть уверенным, как только вы получите идентификатор родителя и убедитесь, что это действительно ваш родитель, вы должны открыть его дескриптор и использовать его.
На всякий случай, если кто-то еще столкнется с этим вопросом и ищет образец кода, мне пришлось сделать это недавно для проекта библиотеки 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);
}
if ( h == INVALID_HANDLE_VALUE ) { // got an invalid handle
- person hmatt1; 28.10.2015
Лучший способ сделать это — вызвать DuplicateHandle()
для создания наследуемой копии вашего дескриптора процесса. Затем создайте дочерний процесс и передайте значение дескриптора в командной строке. Close
дублированный дескриптор в родительском процессе. Когда дочерний элемент закончит работу, ему также потребуется Close
свою копию.
«В качестве альтернативы, может ли кто-нибудь облегчить мои опасения, что pid, который я передаю, может принадлежать другому процессу через некоторое время, если родитель умер?»
Да, PID можно использовать повторно. В отличие от UNIX, Windows не поддерживает строгое дерево отношений родитель-потомок.
NtQueryInformationProcess
возвращает 0xC0000024 или 0xC0000008.
- person Oliver Bock; 29.07.2020