Re: Ожидание завершения процесса и его дочерних процессов
От: ononim  
Дата: 06.11.14 17:29
Оценка: 4 (1)
X>Добрый день!
X>Есть программа, которая создает сторонний процесс A и ожидает его завершения по описателю процесса на WaitForSingleObject. Процесс А в свою очередь создает процессы B и C и сам при этом завершается. После завершения процесса А я получаю возврат из функции ожидания. Вопрос в том, как мне дождаться завершения процессов A, B и С?
X>Через задание — не вариант, т.к. программа, которая создает процесс А может уже сама находиться в задании из которого не сможет выйти и включить дочерние процессы в другое задание.

Навскидку несколько решений, но все топорные:
1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
2) Запустить процесс А под каким нить спецюзером. Периодически проверять список всех процессов и если никого под этим юзером не осталось — значит, час настал.
3) Создать какой нить десктоп CreateDesktop'ом. Запускить процесс А на нем. Периодически проверять десктоп на существование OpenDesktop'ом. Минусы — не будет видать гуя (а может это плюс?), могут возникнуть различные проблемы если например процессы затребуют шелловский функционал или еще чего.
4) Проставить переменную окружения в себе. Ее отнаследуют все ваши дети и внуки (хотя могут и отказаться от "наследства" при желании). Периодически чекать процессы, роясь в их PEBах. По 5 балльной шкале злостного пользования недокументированным функционалом тянет балла на 2. Но потрахаться придеться.
5) Запустить процесс А под дебагом. Ловить дебажные ивенты создания процессов. Советую в процессах первым делом подчищать флажок PEB::BeingDebugged (в wow64 процессах — в обоих PEBах). Иначе хип будет работать в особом, тормозном режиме.
..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.