ОБЗОР
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
kill(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
ОПИСАНИЕ
Системный вызов kill() может быть использован для посылки какого-либо сигнала какому-либо процессу или группе процессов.Если значение pid является положительным, то сигнал sig посылается процессу с идентификатором pid.
Если значение pid равно 0, то sig посылается каждому процессу, который входит в группу вызывающего процесса.
Если значение pid равно -1, то sig посылается каждому процессу, которым вызывающий процесс имеет право отправлять сигналы, за исключением процесса с номером 1 (init), подробности смотрите далее.
Если значение pid меньше -1, то sig посылается каждому процессу, который входит в группу процессов, чей ID равен -pid.
Если значение sig равно 0, то никакой сигнал не посылается, а только выполняется проверка; это можно использовать для проверки существования процесса или группы процессов с заданным ID.
Чтобы процесс мог посылать сигнал, он должен быть привилегированным (в Linux: иметь мандат CAP_KILL), либо реальный или эффективный идентификатор пользователя посылающего процесса должен быть равен реальному или сохранённому идентификатору пользователя процесса, которому отправляется сигнал. Для сигнала SIGCONT посылающий и получающий процессы должны принадлежать одному сеансу (сложилось исторически; правила разные; смотрите ЗАМЕЧАНИЯ).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении (по крайней мере, был послан один сигнал) возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.ОШИБКИ
- EINVAL
- Указан некорректный сигнал.
- EPERM
- Процесс не имеет достаточно прав для отправки сигнала ни одному из группы процессов-получателей.
- ESRCH
- Такой pid или группа процессов не существует. Заметим, что существующий процесс может быть в состоянии зомби --- процесс, для которого подтвердилось завершение, но которого ещё не дождались с помощью wait(2).
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.ЗАМЕЧАНИЯ
Процессу init с идентификатором 1 можно послать только те сигналы, для которых он явно установил обработчики сигналов. Так сделано, чтобы быть уверенным, что в случае какой-либо нештатной ситуации работа системы не будет завершена аварийно.В POSIX.1 требуется, чтобы kill(-1,sig) посылал sig всем процессам, которым вызывающий процесс может послать сигналы, возможно за исключением некоторых процессов, определяемых реализацией системы. Linux позволяет процессу послать сигнал самому себе, но при вызове kill(-1,sig) вызывающий процесс сигнала не получит.
В POSIX.1 говорится, что если процесс посылает себе сигнал и посылающая нить не блокирует сигнал, и нет ещё нити, которая его не блокирует или не ждёт его с помощью sigwait(3), то, по крайней мере, один незаблокированный сигнал должен быть доставлен посылающей нити до возврата из kill().