Как я могу убить все процессы программы? - PullRequest
1 голос
/ 22 мая 2009

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

Я думаю о системе ("killall [имя_программы]"), но должен быть лучший способ ...

Спасибо всем! Леннарт

Ответы [ 4 ]

5 голосов
/ 22 мая 2009

В UNIX отправьте SIGTERM, или SIGABRT, или SIGPIPE или STH. подобно материнскому процессу. Этот сигнал будет затем автоматически распространяться на все клиенты, если они явно не блокируют или игнорируют его.

Используйте getppid() для получения PID для отправки сигнала и kill() для отправки сигнала.

getppid () возвращает идентификатор процесса родитель вызывающего процесса.

Системный вызов kill () можно использовать для отправки любого сигнала в любую группу процессов или процесс.

Примечания: 1. Использование system - зло. Используйте внутренние функции для отправки сигналов. 2. killall было бы еще более злым. Рассмотрим несколько экземпляров вашей программы, запущенной одновременно.

2 голосов
/ 22 мая 2009

См. Как заставить дочерний процесс умереть после выхода из родительского процесса?

В Linux есть вызов prctl(), который явно предназначен для отправки сигнала всем дочерним процессам, когда родитель умирает по любой причине .

Мне нужно проверить, и я не могу сделать это там, где я нахожусь на втором месте, но я действительно не уверен, что утверждение ypnos о распространении SIGPIPE, SIGTERM и SIGABRT среди всех детей является правильным .

Однако, если вы используете kill(-ppid) (обратите внимание на знак минус), то, пока дочерние элементы все еще находятся в группе процессов родительского процесса, ядро ​​будет передавать любой сигнал всем дочерним элементам.

1 голос
/ 22 мая 2009

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

Чтобы убедиться, что ваш материнский процесс является лидером группы процессов, вызовите setsid () во время инициализация вашего процесса.

Затем в вашем дочернем процессе, если вы хотите заставить все процессы завершиться:

pgid = getpgid ();
убить (pgid, 15);

Вы также можете делать трюки, например, приказывать всем своим братьям и сестрам приостановить:

убить (pgid, 20);

И резюме:

kill (pgid, 18);

0 голосов
/ 22 мая 2009

Рассмотрим суицидальный подход - настройку alarm() в начале процесса (как родительского, так и дочернего) с некоторым положительным числом секунд. Если вычисление завершается в течение этого времени и «ошибки нет», вызовите alarm(0), чтобы отменить таймер; в противном случае SIGALRM убьет процесс (при условии, что вы явно не перехватываете или игнорируете его).

Ну, возразите против этого, а не просто проголосуйте:)

...