2010-02-26 3 views
4

я прыгать прямо, чтобы быть кратким и описательным:Прекратить все (Grand) детей при завершении дочернего процесса

C++, Windows API

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

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

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

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

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

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

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

ответ

5

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

+0

Спасибо, Майкл. Это очень перспективно и выглядит так, как будто он отлично решает эту проблему. Теперь идите читать дальше и дайте ему шанс! Благодарим вас за то, что вы делитесь своими знаниями и опытом. – KevenK

+0

Объекты работы больше не работают с Vista. Проводник запускает программы из ярлыка в задании, не позволяя вам делать то же самое с любыми дочерними процессами. –

+0

Я не мог воспроизвести это поведение в своем окне Win7 - я написал небольшую программу, которая создает задание и добавляет к ней. Прекрасно работает при запуске проводником через ярлык. – Michael

Смежные вопросы