Информация об изменениях

Сообщение Re[5]: Ожидание завершения процесса и его дочерних процессов от 10.11.2014 9:08

Изменено 10.11.2014 9:13 ononim

O>>>>Навскидку несколько решений, но все топорные:
O>>>>1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
X>>>Как вариант, но думал есть варианты попроще
O>>У него есть и большой недостаток — если как вы ниже написали процессы B и C могут порождать правнуков, которых тоже нужно ждать — то этот вариант — не вариант.
X>Почему не вариант? Я же знаю PID процессов B и C, почему тогда к правнукам нельзя применить тот же метод?
Потому что между интервалами проверок А и Б могут упасть с трубы B и C могут успеть запуститься, запустить правнуков и издохнуть, и к следующей проверку останутся только правнуки, которых вы упустите.

O>>>>..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес

X>>>Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.
O>>Сделать перехват, и сделать перехват, работающий стабильно на различных системах — это проблемы разных порядков. Особенно если это перехват CreateProcess'а.
X>А чем перехват CreateProcess отличается от перехвата другой функции?
Тем что его чаще все всего и перехватывают. А в хуках самая большая сложность — дружно сосуществовать с другими хуками, некоторые из которых бывают весьма ущербны.
Re[5]: Ожидание завершения процесса и его дочерних процессов
O>>>>Навскидку несколько решений, но все топорные:
O>>>>1) Метод влоб. Toolhelp'ом периодически перечислять все живые процессы, проверяя их парентов. Метод требует _не закрывания_ хэндла на процесс A до окончания всей спецоперации, в противном случае его PID может реюзнуться и выйдет конфуз.
X>>>Как вариант, но думал есть варианты попроще
O>>У него есть и большой недостаток — если как вы ниже написали процессы B и C могут порождать правнуков, которых тоже нужно ждать — то этот вариант — не вариант.
X>Почему не вариант? Я же знаю PID процессов B и C, почему тогда к правнукам нельзя применить тот же метод?
Потому что между интервалами проверок А и Б могут упасть с трубы B и C могут успеть запуститься, запустить правнуков и издохнуть, и к следующей проверке останутся только правнуки, которых вы упустите.

O>>>>..подумаю, может еще чего добавлю, если конечно методы такого рода представляют интерес

X>>>Наверное можно еще сделать перехват CreateProcess и если эта функция вызывается в интересующем процессе, то передавать PID этого процесса ожидающей программе.
O>>Сделать перехват, и сделать перехват, работающий стабильно на различных системах — это проблемы разных порядков. Особенно если это перехват CreateProcess'а.
X>А чем перехват CreateProcess отличается от перехвата другой функции?
Тем что его чаще все всего и перехватывают. А в хуках самая большая сложность — дружно сосуществовать с другими хуками, некоторые из которых бывают весьма ущербны.
Кстати в качестве альтернативы хуков можно рассмотреть ключик App_InitDlls — но у этого способа куча своих недостатков — чтобы прописаться/выписаться нужны админские права, в новых виндах появляются танцы с бубном с подписями и вообще функционированием этого ключа.