Завершить всех (больших) детей при завершении дочернего процесса

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

С++, API Windows

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

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

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

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

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

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

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

Ответы

Ответ 1

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