Системный вызов
kill
может быть использован для посылки какого-либо сигнала какому-либо процессу
или группе процесса.
Если значение pid является положительным, сигнал sig посылается
процессу с идентификатором pid.
Если pid равен 0, то sig посылается каждому процессу, который
входит в группу текущего процесса.
Если pid равен -1, то sig посылается каждому процессу, за
исключением процесса с номером 1 (init), но есть нюансы, которые описываются
ниже.
Если pid меньше чем -1, то sig посылается каждому процессу,
который входит в группу процесса -pid.
Если sig равен 0, то никакой сигнал не посылается, а только выполняется
проверка на ошибку.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха, возвращается ноль. При ошибке, возвращается -1 и значение
errno
устанавливается соответствующим образом.
ОШИБКИ
EINVAL
Задан неправильный сигнал.
ESRCH
Идентификатор процесса pid или группа процесса не существуют.
Заметим, что существующий процесс может быть зомби - процессом,
который уже находится в состоянии завершения, но пока в котором
пока ещё не выполнился wait().
EPERM
Текущий процесс не имеет прав на посылку сигнала к любому из указанных
процессов. Процессы, которые имеют права на посылку сигнала
процессу с номером
pid
должны иметь привелегии суперпользователя или, реальный или
эффективный идентификатор пользователя процесса, посылающего сигнал,
должен быть таким же как реальный или эффективный идентификатор
пользователя процесса, принимающего сигнал.
В случае, когда посылающий и принимающий процессы относятся к одной
сессии, становится доступным сигнал SIGCONT.
ЗАМЕЧАНИЯ
Невозможно послать сигнал процессу с номером 1, т.е. процессу init,
для которого не устанавливается обработчик сигналов. Так сделано,
чтобы быть уверенным, что в случае какой-либо нештатной ситуации,
рабата системы не будет завершена аварийно.
POSIX 1003.1-2001 требует, чтобы kill(-1,sig) посылал sig
всем процессам, которым текущий процесс может послать сигналы,
за исключением возможно нескольких, определяемых реализацией
системы процессов. Linux разрешает любому процессу посылать сигнал
себе, но в Linux системный вызов
kill(-1,sig) не посылает сигнал текущему процессу.
ИСТОРИЯ LINUX
В различных версиях ядра, Linux применяет разные правила, касающиеся
прав доступа, которые требуются для непревилегированного процесса,
чтобы посылать сигнал другому процессу.
В ядрах с 1.0 по 1.2.2, сигнал может быть послан, если эффективный
идентификатор пользователя, посылающего сигнал процесса совпадает
с эффективным идентифкатором пользователя у процесса-получателя или реальный
идентификатор пользователя, посылающего сигнал процесса совпадает
с реальным идентифкатором пользователя у процесса-получателя.
В ядрах с 1.2.3 по 1.3.77, сигнал может быть послан, если эффективный
идентификатор пользвателя, посылающего сигнал процесса совпадает
или с реальным или с эффективным идентифкатором пользователя у
процесса-получателя. Текущие правила, которые соответствуют стандартам
POSIX 1003.1-2001 были введены, начиная с ядра версии 1.3.78.