Опубликован: 16.09.2004 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский физико-технический институт
Лекция 9:

Организация ввода-вывода в UNIX. Файлы устройств. Аппарат прерываний. Сигналы в UNIX

Системный вызов kill() и команда kill

Из всех перечисленных ранее в разделе " Аппаратные прерывания (interrupt), исключения (exception), программные прерывания (trap, software interrupt). Их обработка" источников сигнала пользователю доступны только два – команда kill и посылка сигнала процессу с помощью системного вызова kill() . Команда kill обычно используется в следующей форме:

kill [-номер] pid

Здесь pid – это идентификатор процесса, которому посылается сигнал, а номер – номер сигнала, который посылается процессу. Послать сигнал (если у вас нет полномочий суперпользователя) можно только процессу, у которого эффективный идентификатор пользователя совпадает с идентификатором пользователя, посылающего сигнал. Если параметрномер отсутствует, то посылается сигнал SIGTERM , обычно имеющий номер 15, и реакция на него по умолчанию – завершить работу процесса, который получил сигнал.

Команда kill

Синтаксис команды

kill [-signal] [--] pid
kill -l

Описание команды

Команда kill предназначена для передачи сигнала одному или нескольким специфицированным процессам в рамках полномочий пользователя.

Параметр pid определяет процесс или процессы, которым будут доставляться сигналы. Он может быть задан одним из следующих четырех способов:

  • Число n > 0 – определяет идентификатор процесса, которому будет доставлен сигнал.
  • Число 0сигнал будет доставлен всем процессам текущей группы для данного управляющего терминала.
  • Число -1 с предваряющей опцией -- – сигнал будет доставлен (если позволяют полномочия) всем процессам с идентификаторами, большими 1.
  • Число n < 0, где n не равно -1, с предваряющей опцией -- – сигнал будет доставлен всем процессам из группы процессов, идентификатор которой равен -n.

Параметр -signal определяет тип сигнала, который должен быть доставлен, и может задаваться в числовой или символьной форме, например -9 или - SIGKILL . Если этот параметр опущен, процессам по умолчанию посылается сигнал SIGTERM .

Послать сигнал (не имея полномочий суперпользователя) можно только процессу, у которого эффективный идентификатор пользователя совпадает с идентификатором пользователя, посылающего сигнал.

Опция -l используется для получения списка сигналов, существующих в системе в символьной и числовой формах.

Во многих операционных системах предусмотрены еще и дополнительные опции для команды kill .

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

Системный вызов kill()

Прототип системного вызова

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signal);

Описание системного вызова

Системный вызов kill() предназначен для передачи сигнала одному или нескольким специфицированным процессам в рамках полномочий пользователя.

Послать сигнал (не имея полномочий суперпользователя) можно только процессу, у которого эффективный идентификатор пользователя совпадает с эффективным идентификатором пользователя для процесса, посылающего сигнал.

Аргумент pid описывает, кому посылается сигнал, а аргумент sig – какой сигнал посылается. Этот системный вызов умеет делать много разных вещей, в зависимости от значения аргументов:

  • Если pid > 0 и sig > 0, то сигнал номером sig (если позволяют привилегии) посылается процессу с идентификатором pid.
  • Если pid = 0, а sig > 0, то сигнал с номером sig посылается всем процессам в группе, к которой принадлежит посылающий процесс.
  • Если pid = -1, sig > 0 и посылающий процесс не является процессом суперпользователя, то сигнал посылается всем процессам в системе, для которых идентификатор пользователя совпадает с эффективным идентификатором пользователя процесса, посылающего сигнал.
  • Если pid = -1, sig > 0 и посылающий процесс является процессом суперпользователя, то сигнал посылается всем процессам в системе, за исключением системных процессов (обычно всем, кроме процессов с pid = 0 и pid = 1 ).
  • Если pid < 0, но не –1, sig > 0, то сигнал посылается всем процессам из группы, идентификатор которой равен абсолютному значению аргумента pid (если позволяют привилегии).
  • Если значение sig = 0, то производится проверка на ошибку, а сигнал не посылается, так как все сигналы имеют номера > 0. Это можно использовать для проверки правильности аргумента pid (есть ли в системе процесс или группа процессов с соответствующим идентификатором).

Возвращаемое значение

Системный вызов возвращает 0 при нормальном завершении и –1 при ошибке.

лия логовина
лия логовина

организовать двустороннюю поочередную связь процесса-родителя и процесса-ребенка через pipe, используя для синхронизации сигналы sigusr1 и sigusr2.

Макар Оганесов
Макар Оганесов
Сергей Пархоменко
Сергей Пархоменко
Россия, Ростов-на-Дону, ЮФУ (ДГТУ), 2008