Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 34
Текст из файла (страница 34)
Современные варианты 1.1Х1Х (такие как Зо!аг1з, А1Х, НР-УХ, 4.4ВЗР и Р(К1та1 (Лч1Х) также предлагают совместимые с РО51Х решения. Реализация сигналов в 35Ъ'К4 помимо совместимости со стандартом сохранила совместимость с более ранними версиями 5узгещ Ъ'. Эта глава начинается с объяснения, что такое сигналы, и последующего анализа проблем, имеющихся в оригинальной ОС Зузгет Ч. Затем вы увидите, как эти проблемы были решены в современных операционных системах, располагающих механизмом надежных сигналов.
В конце главы мы расскажем об управлении заданиями и сеансами — понятиями, имеющими тесную связь с сигналами. 4.2. Генерирование и обработка сигналов Сигналы дают возможность вызвать какую-либо процедуру при возникновении события из определенного их набора. События обозначаются целыми числами и представляются символьными константами. Некоторые из событий являются асинхронными уведомлениями (возникающими, например, когда пользователь посылает сигнал прерывания, нажав комбинацию С1г1+С на терминале), в то время как другие представляют собой синхронные ошибки или исключения (например, при попытке обращения по несуществующему адресу).
Процесс оповещения состоит из двух этапов: генерирования и доставки. Сигнал генерируется после того, как возникает определенное событие, требующее уведомления о нем процесса, который явился виновником его появления. Сигнал считается доставленным (или обработанным), когда получивший его процесс определяет факт доставки сигнала и производит необходимые действия. Между этими двумя событиями сигнал находится в режиме ожидания процесса. В оригинальном варианте ОС Бузгет 'у' определено 15 различных сигналов. Системы 4ВЗР и 5ЧК4 поддерживают по 31 сигналу.
Каждому из них присваивается номер от 1 до 31 (установка номера сигнала в О для различных функций имеет специальные значения, например «никаких сигналов»), Адресация сигналов по их номерам отличается в системах Бузгещ 'у' и ВЯЭ ТЛ41Х (например, 5165ТОР имеет номер 17 в 4.3ВБР и номер 23 в 5Ъ'К4).
Более 4.2. Генерирование и обработка сигналов 147 того, многие коммерческие реализации ()Ы1Х (такие как А1Х) поддерживают больше чем 31 сигнал. Обычно программисты предпочитают использовать символические имена для идентификации сигналов. Стандарт РОЯ1Х 1003.1 определяет символические имена для всех поддерживаемых им сигналов.
Эти имена являются переносимыми как минимум для всех реализаций систем, совместимых со стандартом РОБ1Х. 4.2.1. Обработка сигналов Каждый сигнал обладает некоторым действием, установленным по умолчанию, которое производится ядром системы, если процесс не имеет определенного альтернативного обработчика. Всего таких действий пять. + Аварийное завершение (аЬогс).
Завершает процесс после создания дампа состояния процесса (соге с1шпр), представляющего собой содержимое адресного пространства процесса и его контекст регистров, записанные в файл саге, расположенный в текущем каталоге процесса'. Создаваемый файл может быть подвергнут дальнейшему анализу при помощи отладчика или других утилит. + Выход (ехй), Завершает процесс без создания дампа состояния процесса.
+ Игнорирование ()япоге). Игнорирует сигнал. + Остановка (егор). Приостанавливает процесс. + Продолжение (сопвппе). Возобновляет работу приостановленного процесса (или игнорируется в ином случае). Процесс может переопределить действия, производимые по умолчанию для любого сигнала. Таким альтернативным вариантом может быть игнорирование сигнала или запуск определенной в приложении функции, называемой обработчиком сигнала. Процесс может в любое время указать новое действие либо, наоборот, сбросить установки на действия по умолчанию. Процесс вправе временно блокировать сигнал (нс поддерживается в ЯЪ'В2 и более ранних версиях втой системы).
В таком случае сигнал не будет доставлен до тех пор, пока не будет разблокирован. Сигналы 516К10. и 516з10Р являются специальными, и приложения не могут игнорировать, блокировать или определять собственные обработчики для них. Полный список сигналов приведен в табл. 4.1, в которой также имеются ссылки на их действия по умолчанию и существующие ограничения. ' В системе 4.4ВЯЭ файл дампа имеет название саге.ргоо, где рюо — зто первые 16 символов программы, выполнявшейся во время получения сигнала (такой подход более разумен, так как в случае аварийного завершения еще какого-либо процесса, имеющего того же владельца, файл соте не затрется новым).
— Прим. ред. 148 Глава 4. Сигналы и управление сеансами Сигнал Описание Аварийное завершение АРЗВ Процесс аварийно завершен Сигнал тревоги реального времени 516АВКТ 516АЕВМ Выход ОРЗВ ОЗВ Аварийное завершение 516ЕНЕО ОЗВ Продолжение/ игнорирование 516ЕОНТ Аварийное завершение ОЗВ ОАРЗВ Аварийное завершение Выход Арифметическая ошибка 516РРЕ Освобождение линии терминала ОРЗВ 516НОР Аварийное завершение ОАРЗВ 5161ГЕ Игнорирование 5161НРО Выход ОАРЗВ 5161НТ ЗВ Выход/ игнорирование 5?610 ОЗВ Аварийное завершение Выход Ловушка ввода-вывода 51610Т Завершить процесс ОРЗВ ОРЗВ 516К1ЕЕ 516Р1РЕ Выход Выход 516РОЕЕ Выход ЗВ 516РКОР 08 Неполадки питания Игнорирование 516Р(ВК 5160011 Аварийное завершение Сигнал выхода из терминала (Е(г(+~) ОРЗВ Таблица 4.1.
Сигналы 0МХ 516В05 Ошибка шины Потомок завершил работу или приостановлен Возобновить приостановленный процесс 516ЕМТ Ловушка эмулятора Выполнение недопустимой инструкции Запрос состояния (С(г(+т) Прерывание терминала (Стг(+С) Асинхронное событие ввода-вывода Запись в канал при отсутствии считывающих процессов Событие опрашиваемого устройства Профилирование таймера Действие Доступен в' Примечаниев по умолчанию Игнорирование ООЗВ Сигнал Описание Аварийное завершение 5165Е6У Ошибка сегментации ОАРЗВ 18В ОАРВВ Остановка Выход Остановить процесс 5165ТОР 5165У5 Неверный системный вызов ОАРВВ 088 Завершить процесс Аппаратная ошибка Выход 516ТЕКМ 516ТКАР Аварийное завершение Остановка 088 Сигнал остановки терминала (Етг1+2) Остановка 48В Остановка ,188 Игнорирование 8В 5160К6 ОРВВ Выход 51605К1 51605К2 Выход ОРЗВ 88 5?6УТАГКМ Сигнал тревоги вирчуального времени Выход Изменение размера окна Игнорирование 8В 5161У1КЕН 516ХЕР0 88 Аварийное завершение Превышение лимита процессора 88 Аварийное завершение Превышение лимита размера файла 516Х 152 ' Обозначения; Π— сигнал системы 5ЧК2; А — АН51 С;  — 4.3ВЗО; 5 — 5ЧК4; Р— Р051Х.1; 1 — РО51Х.1, прн условии поддержки управления заданиями, г 1 — не может быть перехвачен, блокирован нлн нгнорнроаан; 2 — не сбрасывается а значение по умолчанию, даже а реализациях Зуагею Ч; 3 — а 5ЧК4 действие по умолчанию — выход, а 4.ЗВ51Э вЂ” игнорирование; 4 — по умолчанию выполнение процесса, если тот был приостановлен, в ином случае сигнал игнорируется; 5 — не может быть заблокирован; 6 — процесс может решить: позволить запись а терминал фоновым процессам без генерации этого сигнала нхн нет; 7 — а 5ЧКЗ н более ранних версиях системы назывался 516СГО.
Важно отметить, что любое действие, в том числе и завершение работы, относится только к тому процессу, которому был доставлен сигнал. Такой подход требует, по крайней мере, чтобы процесс был назначен в текущий момент на выполнение. В загруженных системах для процесса, обладающего низким приоритетом, ожидание в очереди планировщика может занять некоторое значительное количество времени. Еще одна задержка может произой- 516Т5ТР 516ТТ1Н 516ТТО0 Чтение из терминала фоновым процессом Запись в терминал фоновым процессом Экстренное событие канала ввода-вывода Определяется произвольно Определяется произвольно 4.2. Генерирование и обработка сигналов 149 Действие Доступен в' Примечаниях по умолчанию 150 Глава 4.
Сигналы и управление сеансами ти, если процесс окажется выгруженным, приостановленным или блокированным без возможности прерывания. Ядро системы предупреждает процесс о наличии ожидающих его сигналов при помощи вызова функции Ьз)п(), который делается от имени процесса для проверки ожидающих сигналов. Вызов функции Вз(9() происходит только в следующих случаях: + до возвращения в режим задачи после системного вызова или прерывания; + сразу перед блокированием на прерываемом событии; + немедленно после пробуждения от прерываемого события. Если функция 1зз)по возвращает значение ТЯОЕ, то ядро вызовет функцию рз1о() для диспетчеризации сигнала. Эта функция завершит процесс, создаст файл соте (по необходимости) или же вызовет зепЫдО для запуска обработчика, определенного в приложении.
Функция зепй19() возвращает процесс в режим задачи, передает управление обработчику сигнала и указывает процессу на необходимость продолжения выполнения прерванного кода после завершения функционирования обработчика. Реализация этих функций сильно зависит от платформы, так как они должны манипулировать стеком приложения, а также сохранять, загружать и изменять контекст процесса. Сигнал Обычный режим , 'Возврат к нормальной , 'обработчика сигнала ,' Рис.