Как дождаться выхода клонированного дочернего процесса вызванного процесса? - PullRequest
4 голосов
/ 11 марта 2010

У меня есть программа, которая должна вызывать процесс для выполнения операции и ждать, пока он завершит операцию. Проблема заключается в том, что вызванный процесс клонирует себя и завершает работу, что приводит к возвращению API ожидания при выходе из процесса. Как я могу дождаться, пока клонированный процесс завершит выполнение и вернется?

Я использую объект Windows JOB, указанный в http://www.microsoft.com/msj/0399/jobkernelobj/jobkernelobj.aspx, Но я не уверен, что это лучший способ.

Ответы [ 3 ]

1 голос
/ 11 марта 2010

ммм, я почти уверен, что вы можете использовать идентификатор процесса spawner из любого процесса. Я бы перебрал все процессы, нашел бы, чей родительский идентификатор совпадает с процессом, который вы породили, и дождался его смерти.

в качестве альтернативы (я имею в виду, это довольно взломать), что делает процесс дочерний ребенок? Есть ли другой способ определить, когда он закончил делать то, что должен был сделать?

хакерский способ получить идентификатор родительского процесса

http://www.codeguru.com/cpp/w-p/win32/article.php/c1437

берет дескриптор и, используя метод из кода выше, возвращает родительский идентификатор.

http://msdn.microsoft.com/en-us/library/ms684280(VS.85).aspx

OpenProcess берет идентификатор, получает дескриптор (если вам повезет)

http://msdn.microsoft.com/en-us/library/ms684320(VS.85).aspx

GetProcessId берет дескриптор, получает его идентификатор.

http://msdn.microsoft.com/en-us/library/ms683215(VS.85).aspx

GetExitCodeProcess принимает дескриптор, возвращает, завершен ли процесс или нет.

http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx

так что воздержитесь от использования скрытых вызовов nt, о которых вам прямо сказано не делать, вам в основном придется создать свой процесс, получить его идентификатор, затем спамить весь процесс, открывая их и проверяя их родительские идентификаторы по идентификатору процесса вы создали, если не нашли, то все готово, если вы это сделаете, спамите его с помощью GetExitCodeProcess до тех пор, пока оно не будет сделано.

Я не проверял ничего из этого, но похоже, что это можно сделать. хотя, если это ЛУЧШИЙ способ сделать это, мне, возможно, придется потерять всякую веру в окна ...

0 голосов
/ 11 марта 2010

+ 1 для использования объектов задания;)

Предполагая, что процесс, который вы запускаете, не порождает клонированную версию самого себя таким образом, что он выходит из работы ...

Вы должны иметь возможность просто отслеживать события задания и действовать на JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO (см. JOBOBJECT_ASSOCIATE_COMPLETION_PORT и SetInformationJobObject () ). Мониторинг работы таким способом также даст вам уведомления о ProcessId новых процессов, созданных в работе, и информацию о том, когда они выходят.

0 голосов
/ 11 марта 2010

Если у вас есть контроль над источником вызванного процесса, одним из возможных решений было бы заставить его ждать процесса, который он порождает, путем клонирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...