Процесс может переопределить действия, производимые по умолчанию для любого сигнала. Таким альтернативным вариантом может быть игнорирование сигнала или запуск определенной в приложении функции, называемой обработчиком сигнала. Процесс может в любое время указать новое действие либо, наоборот, сбросить установки на действия по умолчанию.
Процесс вправе временно блокировать сигнал (не поддерживается в SVR2 и более ранних версиях этой системы). В таком случае сигнал не будет доставлен до тех пор, пока не будет разблокирован.
Сигналы SIGKILL и SIGST0P являются специальными, и приложения не могут игнорировать, блокировать или определять собственные обработчики для них. Полный список сигналов приведен в табл. 4.1, в которой также имеются ссылки на их действия по умолчанию и существующие ограничения.
Важно отметить, что любое действие, в том числе и завершение работы, относится только к тому процессу, которому был доставлен сигнал. Такой подход требует, по крайней мере, чтобы процесс был назначен в текущий момент на выполнение. В загруженных системах для процесса, обладающего низким приоритетом, ожидание в очереди планировщика может занять некоторое значительное количество времени. Еще одна задержка может произойти, если процесс окажется выгруженным, приостановленным или блокированным без возможности прерывания.
Ядро системы предупреждает процесс о наличии ожидающих его сигналов при помощи вызова функции issig(), который делается от имени процесса для проверки ожидающих сигналов. Вызов функции issig() происходит только в следующих случаях:
4 до возвращения в режим задачи после системного вызова или прерывания;
4 сразу перед блокированием на прерываемом событии;
4- немедленно после пробуждения от прерываемого события.
Если функция issig() возвращает значение TRUE, то ядро вызовет функцию psig() для диспетчеризации сигнала. Эта функция завершит процесс, создаст файл core (по необходимости) или же вызовет sendsig() для запуска обработчика, определенного в приложении. Функция sendsig() возвращает процесс в режим задачи, передает управление обработчику сигнала и указывает процессу на необходимость продолжения выполнения прерванного кода после завершения функционирования обработчика. Реализация этих функций сильно зависит от платформы, так как они должны манипулировать стеком приложения, а также сохранять, загружать и изменять контекст процесса.
Сигналы вырабатываются вследствие происхождения асинхронных событий, которые могут произойти после любой инструкции в области кода процесса. После завершения обработки сигнала процесс восстанавливает свое функционирование с того места, где его выполнение было прервано сигналом
Если сигнал приходит тогда, когда процесс находится в стадии выполнения системного вызова, ядро системы прерывает обработку вызова и возвращает ошибку EINTR. В ОС 4.2BSD был введен механизм автоматического рестарта системного вызова после сигнала (см. раздел 4.4.3). Система 4.3BSD предлагает вызов siginterrupt, отключающий эту возможность для конкретного сигнала.
Опубликовал katy
July 03 2015 16:17:52 ·
0 Комментариев ·
2511 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.