<<
>>

Реализация сигналов

С сигналами связаны 8 системных вызовов, перечисленных в табл. 4.5. Как сами сигналы, так и эти системные вызовы обрабатываются кодом из файла signal. с.

Таблица 4.5. Системные вызовы, относящиеся к сигналам

Назначение

Изменение реакции на будущий сигнал Модификация набора блокируемых сигналов Отправка сигнала другому процессу Отправка сигнала ALRM самому себе после задержки Приостановка работы до следующего сигнала

Изменение набора блокируемых сигналов с последующим вызовом pause Определение набора текущих (то есть заблокированных) сигналов Восстановление после завершения обработчика сигнала

Системный вызов sigaction поддерживает две функции, sigaction и signal, позволяющие процессу изменять свою реакцию на сигнал.

Функция sigaction регламентирована стандартом POSIX и является в любом случае предпочтительной, однако библиотечная функция signal удовлетворяет стандарту ANSI С, и если программа должна быть переносима на системы, не соответствующие

стандарту POSIX, необходимо использовать вторую функцию.

Код do_sigaction (строка 19544) начинается с проверок правильности номера сигнала и отсутствия попыток изменить реакцию на сигнал sigkill (строки 19550-19551). Сигнал sigkill нельзя ни игнорировать, ни блокировать, ни обрабатывать. Это то исключительное средство, при помощи которого пользователь может контролировать собственные процессы, а системный оператор — пользователей. При вызове sigaction передаются указатели на структуру типа sigaction, по адресу sig_osa помещаются старые значения атрибутов, а по адресу sig_nsa — новый набор атрибутов.

На первом шаге, чтобы скопировать текущие значения атрибутов по указателю sig_osa, вызывается системное задание. Далее, при вызове sigaction указатель sig_nsa может иметь значение NULL.

Это означает, что требуется считать текущие значения атрибутов, не меняя их. В таком случае sigaction немедленно возвращает управление (строка 19560). Если указатель sig_nsa не равен NULL, в пространство менеджера процессов копируется новая структура, описывающая действие сигнала.

Код в строках 19567-19585 модифицирует битовые карты mp_catch, mp_ignore и mp_sigpending, чтобы указанный сигнал либо игнорировался, либо обрабатывался так, как предлагается по умолчанию, либо вызывал обработчик. Поле sa_handler структуры sigaction используется для передачи указателя на процедуру в исполняемую функцию, если сигнал вызывает обработчик, либо одного из специальных кодов SIG_IGN и SIG_DFL, значения которых понятны, если вы ориентируетесь в рассмотренных ранее стандартах обработки сигналов POSIX. Кроме того, может использоваться код SIG_MESS, специфичный для MINIX 3; мы рассмотрим его позже.

Библиотечные функции sigaddset и sigdelset модифицируют битовые карты сигналов, хотя те же действия можно реализовать и при помощи макроса, как и другие простые манипуляции с битами. Тем не менее эти функции требуются по стандарту POSIX с целью упростить перенос программ на другие системы, в том числе те, в которых общее число сигналов превышает число битов в целом значении. Использование библиотечных функций упрощает и перенос самой системы MINIX 3 на различные платформы.

Ранее мы упомянули особый случай — код SIG_MESS. Этот код, проверяемый в строке 19576, доступен только для привилегированных (системных) процессов. Как правило, такие процессы блокируются, ожидая сообщений-запросов. Это означает, что обычный метод получения сигнала, при котором менеджер процессов просит ядро выставить кадр сигнала на стек приемника, будет отложен до момента, когда сообщение активизирует приемник. Код SIG_MESS предписывает менеджеру процессов доставить уведомление, имеющее более высокий приоритет, чем обычные сообщения. Уведомление содержит набор активных сигналов в качестве аргумента, допуская передачу нескольких сигналов в одном сообщении.

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

Для каждого потенциального сигнала здесь есть битовая карта, sa_mask, определяющая, какие сигналы будут блокироваться при обработке. Кроме того, для каждого сигнала хранится указатель, sa_handler. Он может содержать либо указатель на функцию обработки, либо специальное значение, означающее, что сигнал должен быть блокирован, обработан, как предписано по умолчанию, либо использован для генерации сообщения. Адрес библиотечной функции, по завершении обработчика выполняющей системный вызов sigreturn, хранится в поле шр_ sigretrun. Этот адрес передается в одном из полей сообщения, которое получает менеджер процессов.

POSIX позволяет процессу изменять способ обработки получаемых им сигналов даже внутри обработчика. Благодаря этому можно, например, изменить реакцию на сигнал на время его обработки, а затем восстановить нормальный отклик. Следующая группа системных вызовов и служит для подобных манипуляций сигналами. Вызов sigpending выполняется функцией do_sigpending (строка 19597), возвращающей битовую карту mp_sigpending, по которой процесс может определить, имеются ли активные сигналы. Вызов sigprocmask, обслуживаемый функцией do_sigprocmask, возвращает набор блокируемых сигналов. Кроме того, с его помощью можно изменить блокировку либо одного сигнала из набора, либо сразу установить новый набор. В тот момент, когда с сигнала снимается блокировка, стоит проверить, есть ли задержанные сигналы, для этого в конце вариантов SIG_SETMASК и SIG_UNBLOCK вызывается функция check_ pending (строки 19635 и 19641). Функция do_sigsuspend выполняет системный вызов sigsuspend. Этот вызов приостанавливает выполнение процесса до тех пор, пока не будет получен сигнал. Как и другие обсуждаемые здесь функции, do_sigsuspend манипулирует битовыми картами. Кроме того, она устанавливает в поле mp_f lags бит SIGSUSPENDED, что и предотвращает выполнение процесса. Опять же, в завершение здесь стоит вызвать функцию check_pending. Наконец, функция do_sigretrun обслуживает системный вызов sigreturn, обеспечивающий возврат из пользовательского обработчика сигнала.

Эта функция восстанавливает контекст сигналов, предшествующий входу в обработчик, а также вызывает функцию check_pending в строке 19682.

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

Некоторые сигналы, такие как SIGINT, исходят от самого ядра. Функция ksig_ pending (строка 19699) выполняется, когда ядро посылает менеджеру процессов сообщение об активных сигналах. Активные сигналы могут иметься у нескольких процессов, поэтому цикл в строках 19714-19722 многократно запрашивает активный сигнал у системного задания, передает его процедуре handle_ sig и указывает системному заданию на то, что обработка завершена, если процессов с активными сигналами больше нет. В сообщения включается битовая

карта, что позволяет ядру генерировать несколько сигналов одним сообщением. Следующая функция, handle_sig, побитно обрабатывает битовую карту (строки 19750-19763). Некоторые сигналы ядра требуют особого внимания: иногда идентификатор процесса изменяется, чтобы сигнал был доставлен группе процессов (строки 19753-19757). В противном случае для каждого установленного бита вызывается функция check_sig, как в подпрограмме do_kill.

<< | >>
Источник: Э. ТАНЕНБАУМ, А. ВУДХАЛЛ. ОПЕРАЦИОННЫЕ СИСТЕМЫ Разработка и реализация 3-е издание. 2007

Еще по теме Реализация сигналов:

  1. Ловите сигналы
  2. Понимание невербальных сигналов в деловой ситуации.
  3. РАБОТА С ДАЛЬНИМИ СИГНАЛАМИ. ПВБ
  4. СИМОРОНСКИЕ ПРИНЦИПЫ РАБОТЫ С СИГНАЛАМИ
  5. Предложение №40 Работай с сигналами страха Рецепт освобождения от зависимостей
  6. СИГНАЛЫ, ПРЕДУПРЕЖДАЮЩИЕ МУЖЧИНУ О ТОМ, ЧТО ЖЕНЩИНА, ВОЗМОЖНО ОПУСКАЕТСЯ В КОЛОДЕЦ ИЛИ ЧТО ЕЙ ОСОБЕННО НУЖНА ЕГО ЛЮБОВЬ
  7. Глава 6. Реализация права
  8. 4.2. Реализация
  9. 4. Реализация прав по ипотеке
  10. 3.3. Дальнейшая реализация проекта
  11. РЕАЛИЗАЦИЯ МЫСЛЕННОГО ПРЕДСТАВЛЕНИЯ
  12. 10. Реализация заложенного имущества
  13. Механизм реализации личности
  14. Статья 591. Реализация предмета залога
  15. Практическая реализация.
  16. Практическая реализация.