Завершить все (великие) дети при завершении дочернего процесса - PullRequest
4 голосов
/ 27 февраля 2010

Я прыгну прямо, чтобы быть кратким и описательным:

C ++, Windows API

Я создаю дочерние процессы, используя CreateProcess для запуска внешних приложений (из командной строки). Я встроил таймаут, и если к тому времени дочерний процесс не вернул нормальное выполнение, я хочу принудительно завершить этот дочерний процесс.

В идеале я хотел бы, чтобы этот дочерний процесс действовал так же, как если бы он вызвал ExitProcess, или как если бы Ctrl+C было отправлено на его консоль (которая вызывает ExitProcess из обработчика управления консоли по умолчанию) .

Мое решение до сих пор заключалось в использовании TerminateProcess для насильственного убийства ребенка. Это вынуждает ребенка немедленно прекратить работу, но, к сожалению, если этот ребенок порождает каких-либо собственных детей, ему остается бежать до своего «естественного» завершения.

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

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

Предположим, что нет никаких знаний о процессах внуков (имен / pids / и т. Д.), Которые позволили бы мне вручную вызывать TerminateProcess в процессах внуков. Хотя это можно сделать путем ручного перечисления всех процессов, сопоставления взаимосвязей процессов и отслеживания всех процессов, я не считаю это допустимым решением, за исключением абсолютного последнего средства.

Спасибо за ваше время.

1 Ответ

5 голосов
/ 27 февраля 2010

Вы можете использовать Объекты заданий , чтобы уничтожить все процессы как единое целое.Вы создаете объект задания с помощью API CreateJobObject и назначаете ему процесс с помощью AssignProcessToJobObject .Новые процессы, созданные процессом в объекте задания, по умолчанию принадлежат одному и тому же объекту задания.Вызов TerminateJobObject завершит все связанные процессы в объекте задания.

...