убить - это убивает процесс сразу? - PullRequest
4 голосов
/ 12 декабря 2011

Что точно делает kill?

У меня есть родительский процесс, который создает 100 (в качестве примера) дочерних процессов один за другим.В конце работы любого ребенка я убиваю ребенка с помощью kill(pid_of_child, SIGKILL), и я не вижу этого в выводе ps.Но если с родительским процессом что-то не так, и я выхожу из родительского процесса с exit(1) (на данный момент есть только 1 дочерний процесс - я могу проверить tht в ps), тогда я вижу много <defunct> процессы, чей ppid является pid родительского процесса.

Как это возможно?kill не полностью уничтожил дочерние процессы?

Ответы [ 3 ]

8 голосов
/ 12 декабря 2011

kill не убивает ничего .Он посылает сигналы целевому процессу.SIGKILL это просто сигнал.Теперь стандартное действие для SIGKILL - единственное действие, фактически, поскольку SIGKILL не может быть обработан или проигнорирован процессом - это выйти, это правда.

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

7 голосов
/ 12 декабря 2011

Всякий раз, когда процесс завершается, независимо от того, как он завершается (kill или иным образом), он остается в таблице процессов ядра до тех пор, пока его родительский процесс не получит свое состояние завершения (с wait и друзьями).Оставив его в таблице процессов, вы избежите ряда неприятных условий гонки.

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

1 голос
/ 12 декабря 2011

Да, SIGKILL завершает процесс, но в любом случае (нормальный выход или завершение) процессы имеют статус выхода, который необходимо сохранять для потенциальных читателей - так как такая запись в таблице процесса может оставаться до этогоготово.См http://en.wikipedia.org/wiki/Zombie_process.

...