Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Акуленок_часть1.doc
Скачиваний:
38
Добавлен:
13.11.2019
Размер:
1.43 Mб
Скачать

3.8.1. Сигналы

Сигналы были первыми средствами IPC, т.е. сигналы можно рассматривать как простейшую форму межпроцессорного взаимодействия, при которых нарушается нормальное выполне­ние процесса. В то же время сигнал означает условие, существующее внутри процесса, которое требует внимания процесса. Главная задача сигнала – сообщить о возникновении проблемы. Иными словами, сигнал – это способ информирования процесса со стороны ядра о происшествии некоторого события. Смысл термина "сигнал" состоит в том, что, сколько бы однотипных событий в системе не произошло, по поводу каждой такой группы событий процессу будет подан ровно один сигнал. Т.е. сигнал означает, что определяемое им событие произошло, но не несет информации о том, сколько именно произошло однотипных событий.

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

Примерами ситуаций для формирования сигнала являются следующие:

  • окончание процесса–потомка (по причине выполнения системного вызова exit или системного вызова signal с параметром "death of child (смерть потомка)";

  • возникновение исключительной ситуации в поведении процесса (выход за допустимые границы виртуальной памяти, попытка записи в область виртуальной памяти, которая доступна только для чтения и т.д.);

  • превышение верхнего предела системных ресурсов;

  • оповещение об ошибках в системных вызовах (несуществующий системный вызов, ошибки в параметрах системного вызова, несоответствие системного вызова текущему состоянию процесса и т.д.);

  • сигналы, посылаемые другим процессом в пользовательском режиме;

  • сигналы, поступающие вследствие нажатия пользователем определенных клавишей на клавиатуре терминала, связанного с процессом (например, Ctrl+C или Ctrl+D);

  • сигналы, служащие для трассировки процесса.

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

В разных UNIX может быть разное количество сигналов, стандарт POSIX 1.1 определяет тридцать один сигнал. Каждый из них имеет свое мнемоническое обозначение и номер. В разных системах мнемонические обозначения остаются одинаковыми, а номер может быть разным.

Каждый сигнал имеет уникальный номер, однозначно определяющий событие, которым он вызван. Классические версии OS UNIX определяли 16 сигналов с номерами от 1 до 16. Например, список сигналов в Solaris ограничен сорока двумя сигналами.

Для удобства спецификации сигналов используются символьные мнемоники. При этом их цифровое значение с использованием мнемонической формы записи хранится в файле <signal.h>.

Ниже перечислены мнемоники основных сигналов, с кратким описанием событий, инициирующих их появление.

SIGHUP (1) – это сигнал сообщения «о зависании». Сигнал посылается лидеру сеанса, связанному с управляющим терминалом, когда ядро обнаруживает, что терминал отсоединился (потеря линии). Сигнал также посылается всем процессам текущей группы при завершении выполнения лидера.

SIGINT (2) – это сигнал прерывания, который обычно посылается ядром всем процессам текущей группы при нажатии клавиатурной комбинации <Ctrl+C> или клавиши прерывания <DEl>.

SIGQUIT (3) – сигнал выхода, генерируется при нажатии клавиатурной комбинации <Ctrl+\>.

SIGKILL (9) – сигнал безусловного завершения процесса, который является не улавливаемым сигналом, т.е. этот сигнал нельзя ни перехватить, ни игнорировать. Он немедленно завершает выполнение процесса, который не может выполнить операции по очистке. (В руководстве он описан как сигнал «окончания с особым ущербом»).

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

SIGSTOP (23) – приостановка выполнения процесса.

SIGCONT (24) – возобновление выполнения приостановленного процесса.

Процесс может выбрать одно из трех возможных действий при получении сигнала:

  1. Он может игнорировать сигнал. Не следует игнорировать сигналы, вызванные аппаратной частью, например, при и делении на 0 или ссылке не недопустимые области памяти, так как дальнейшие результаты в отношении данного процесса непредсказуемы.

  2. Процесс может потребовать действия по умолчанию. Как ни печально, обычно это сводится к завершению выполнения процесса.

  3. Наконец, процесс может перехватить сигнал и самостоятельно обрабо­тать его. Например, перехват сигнала SIGINT позволит процессу уда­лить созданные им временные файлы, короче, достойно подготовиться к "смерти". Следует иметь в виду, что сигналы SIGKILL и SIGSTOP нельзя ни перехватить, ни игнорировать.

В табл. 3.1 приведен список сигналов, определенный стандартом POSIX 1.1

Таблица 3.1.