От man 2 kill
:
Если сиг равен 0, то никакой сигнал не посылается, но проверка ошибок по-прежнему выполняется ; это можно использовать для проверки наличия идентификатора процесса или идентификатора группы процессов.
kill(2)
возвращается 0
на успех, и -1
иначе. Таким образом, с нулевым сигналом, считая, что процесс имеет достаточное разрешение для отправки сигнала в целевой процесс, возвращается 0
, если существует идентификатор процесса или группы процессов, в противном случае он возвращает -1
(и устанавливает errno
на ESRCH
). Обратите внимание, что на странице man просто указано, что проверка ошибок по-прежнему выполняется, поэтому она вернет -1
и установит errno
в EPERM
, если целевой процесс существует, но процесс отправки не имеет достаточных разрешений для отправки ему сигнала.
killall(1)
и kill(1)
командные утилиты ведут себя аналогичным образом, так как они используют kill(2)
под капотом.
Обратите внимание, что программный код не должен полагаться на это, чтобы принимать решения на основе существования процесса: всегда существует окно времени между проверкой того, существует ли процесс и с использованием той информации, в которой процесс может завершиться (и, возможно, новый, несвязанный процесс начинается в этом окне времени, и один и тот же PID перерабатывается и используется).
Редко бывает, чтобы убить процесс с помощью SIGKILL (сигнал 9), потому что процесс не имеет возможности выполнить какую-либо очистку перед завершением. Это следует использовать только в качестве последнего средства, когда ни «SIGINT», ни «SIGTERM», похоже, не работают. –