2012-01-06 3 views
17

Является ли функция kill в Linux синхронной? Скажем, я программно вызываю функцию kill для завершения процесса, будет ли он возвращаться только тогда, когда предполагаемый процесс будет завершен, или просто отправит сигнал и вернется. Если это так, как я могу заставить его ждать, пока задуманный процесс будет убит?Является ли функция kill синхронной?

+2

Анекдотически я могу сказать «нет», так как я использовал «kill» в процессе, чтобы он возвращался и все еще присутствовал. Затем нужно было сделать «kill -9». –

+1

Примечание: не все сигналы, которые вы можете отправить процессу *, * завершат его, даже «kill 1234» (используя «SIGTERM») могут быть захвачены и обойдены. Единственный способ безусловного убийства - использовать «kill -9», что довольно жестоко (нет возможности для очистки). – Piskvor

+1

Даже «kill -9» всегда убивает его немедленно, так как есть некоторые состояния (в частности, состояние «D»), в которых он не умрет, пока нить ядра, связанная с ним, не завершится. –

ответ

18

Нет, поскольку он ничего не убивает, он посылает сигнал только процессу.

По умолчанию этот сигнал может быть заблокирован или проигнорирован.

Вы не можете блокировать kill -9, который представляет собой отправку SIGKILL

Ждать процесс, чтобы умереть:

while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done 
+0

+1 для показа простого метода ожидания до исчезновения pid. –

+0

SIGKILL не может быть заблокирован или проигнорирован процессом. Но вы правы, что процесс не прекратится немедленно. Если процесс выполняет системный вызов, он заканчивается только при возврате системного вызова. Поэтому, если это действительно тяжелая обработка, это может занять некоторое время. – ugoren

+1

Он также откажется умереть, если он находится в состоянии 'UNINTERRUPTIBLE' –

3

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

4

kill не может быть синхронным, поскольку он только посылает сигнал. Целевой процесс может игнорировать входящие сигналы (см. SIG_IGN), поэтому нет гарантии относительно эффекта kill.

Непросто провести эксперимент, проверяя эту гипотезу. Начните процесс A и сделайте его обработкой SIGTERM с 10-секундным сном перед смертью. Затем запустите процесс B, который доставит SIGTERM в A и немедленно выйдет.

3
  1. Номер man 2 kill
  2. man wait

Смотрите также man 7 signal для более подробной информации о сигналах Unix.

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