Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен UNIX.docx
Скачиваний:
25
Добавлен:
11.06.2015
Размер:
532.39 Кб
Скачать

Доставка и обработка сигнала

Для каждого сигнала в системе определена обработка по умолчанию, которую выполняет ядро, если процесс не указал другого действия. В общем случае возможны действия: завершить выполнение процесса (с созданием образа памяти core и без), игнорировать сигнал, остановить процесс и продолжить процесс.

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

Доставка сигнала происходит после того, как ядро от имени процесса вызывает системную процедуруissig(), которая проверяет, существуют ли ожидающие доставки сигналы, адресованные данному процессу. Процедура issig() вызывается ядром в трех случаях:

  1. Непосредственно перед возвращением из режима ядра в пользовательский режим после обработки системного вызова или прерывания.

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

  3. Сразу же после пробуждения после сна с приоритетом, допускающим прерывание сигналом.

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

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

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

Основные сигналы

Информация об основных сигналах представлена в табл. 18.

Таблица 18. Основные сигналы

Сигнал

Стандартная обработка

Значение

SIGTERM 15

Завершение процесса

Стандартный сигнал, посылаемый для остановки процесса.

SIGHUP 1

Завершение процесса

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

SIGKILL 9

Завершение процесса

Не перехватываемый сигнал, позволяющий завершить любой процесс.

SIGILL 4

Завершение процесса и сброс образа памяти

На центральный процессор была послана запрещенная инструкция. Это могло быть следствием недопустимого перехода в машинном коде программы, например, попытки выполнить строку данных.

SIGTRAP 5

Завершение процесса и сброс образа памяти

Была установлена ловушка точки прерывания процесса. Этим управляет системный вызов ptrace, который полезен для отладки.

SIGFPE 8

Завершение процесса и сброс образа памяти

Была попытка выполнить запрещенную арифметическую операцию, например, взятие логарифма отрицательного числа или деление на 0.

SIGBUS 10

Завершение процесса и сброс образа памяти

Ошибка на шине ввода-вывода. Обычно это является результатом попытки выполнить чтение или запись вне границ памяти программы.

SIGSEGV 11

Завершение процесса и сброс образа памяти

Это нарушение сегментации - проклятие разработчиков программ! Оно означает, что вы попытались получить доступ к сегменту памяти запрещенным образом. Может быть, это было присваивание значения части сегмента кода или чтение из нулевого адреса.

SIGPIPE 13

Завершение процесса

Программа попыталась выполнить чтение или запись в программный канал, другой конец которого уже завершил работу. Этот сигнал помогает завершить работу конвейера, когда одна из его команд дала сбой.

SIGALRM 14

Завершение процесса

Программист может установить будильник, чтобы позволить вам в определенный момент времени выполнить какое-нибудь действие.

SIGCHLD 18

Игнорируется

Сначала это был сигнал завершения работы дочернего процесса, но сейчас он означает изменение состояния дочернего процесса.

SIGTSTP 24

Остановка процесса

Это запрос от терминала на остановку процесса. Посылка этого сигнала процессу происходит при нажатии комбинации клавиш Ctrl-Z.

SIGCONT 25

Игнорируется

Этот сигнал указывает процессу на возобновление его работы. Процессу посылается либо команда fg, либо bg, а командный интерпретатор выполняет внутренний системный вызов wait для привилегированного процесса, либо не выполняет его для фонового процесса.

Детальная информация о сигналах представлена на страницах справочного руководства signal.

Процесс с помощью системного вызова signal() может задать нестандартный обработчик любого сигнала, кроме SIGKILL (9).