Разница между SIGKILL SIGTERM и деревом процессов - PullRequest
14 голосов
/ 23 марта 2011

В чем разница между SIGTERM и SIGKILL, когда дело доходит до дерева процессов?
Когда корневой поток получает SIGKILL, он убивается чисто или оставляет свои дочерние потоки как зомби?
Есть ли какой-нибудь сигнал, который можно отправить корневому потоку для чистого выхода, не оставляя никаких потоков зомби?

Спасибо.

Ответы [ 2 ]

16 голосов
/ 02 апреля 2014

Если вы уничтожите корневой процесс (родительский процесс), это должно сделать детей-сирот, а не детей-зомби.дети-сироты создаются, когда вы убиваете родителя процесса, а ядро ​​делает init родителем детей-сирот.init должен ждать, пока сирота не умрет, а затем использовать wait, чтобы очистить его.

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

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

Чтобы убить ваших сирот, используйте kill -9, что эквивалентно SIGKILL.

Вот более подробное руководство по уничтожению вещей в linux: http://riccomini.name/posts/linux/2012-09-25-kill-subprocesses-linux-bash/

1 голос
/ 23 марта 2011

Вы не можете контролировать это по сигналу;только его родительский процесс может контролировать это, вызывая waitpid() или устанавливая обработчики сигналов для SIGCHLD.Подробности смотрите в SIGCHLD и SA_NOCLDWAIT на справочной странице * 1005.

Кроме того, что происходит с дочерними потоками, зависит от версии ядра Linux.В потоках POSIX версии 2.6 уничтожение основного потока должно привести к чистому завершению работы других потоков.С 2.4 LinuxThreads каждый поток на самом деле является отдельным процессом, и SIGKILL не дает корневому потоку возможности сказать другим отключиться, тогда как SIGTERM делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...