Разница между SIGKILL SIGTERM с учетом дерева процессов

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

Спасибо.

Ответ 1

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

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

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

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

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

Ответ 2

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

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