Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 37
Текст из файла (страница 37)
Такой подход позволяет одному системному вызову работать сразу с несколькими сигналами. Вызов з1дзеппазк используется для указания набора блокируемых сигналов. Вызов з1дп1оск добавляет в этот набор один или несколько дополнительных сигналов. Реализация вызова з1драпзе в системе ВЯЭ атомарно устанавливает новую маску блокируемых сигналов и переводит процесс в состояние сна до прихода сигнала. Системный вызов з1дуес заменил собою ейдпа1. Точно так же, как и з1дпа1, з1дуес устанавливает обработчик для одного из сигналов. Дополнительно вызов гйдуес может задавать маску, ассоциируемую с этим сигналом.
После вырабатывания такого сигнала ядро системы перед вызовом обработчика установит новую маску блокируемых сигналов, являющуюся объединением текущей маски, маски, заданной в з1дчес, и текущего сигнала. Таким образом, обработчик всегда запускается, когда текущий сигнал блокирован, — следовательно, повторяющийся сигнал не будет доставлен до тех пор, пока обработчик не завершит свою работу. Такое устройство сигнального механизма наиболее соответствует типичным сценариям вызова обработчиков сигналов.
Блокирование дополнительных сигналов, вырабатываемых во время функционирования обработчика, является весьма необходимой функцией, так как сами по себе обработчики сигналов обычно являются критическими участками кода. После возврата из обработчика происходит восстановление маски блокированных сигналов в ее предыдущее значение. Еще одной важной возможностью является обработка сигналов в отдельном стеке. Представьте, что процесс управляет своим собственным стеком. Он может установить обработчик для сигнала 5165ЕИ, вырабатываемого при 4.4.
Надежные сигналы 159 переполнении стека. В обычной ситуации обработчик запустится с тем же, уже переполненным стеком, что приведет к вырабатыванию еще одного сигнала 5165ЕБЧ. Если обработчик будет стартовать, используя при этом отдельный стек, то проблема не возникнет. Отдельный стек для сигнала также полезен и для нитевых библиотек прикладного уровня. Системный вызов з19згас1 задает отдельный стек, который будет использоваться обработчиком сигнала.
Ответственность за правильное указание размера такого стека лежит на разработчике, поскольку ядро системы ничего не знает о его границах. В ОС ВЗР представлено несколько дополнительных сигналов, в том числе специально выделенных для управления заданиями'. Задание — это группа связанных между собой процессов, обычно формирующих едингяй конвейер. Пользователь может выполнять несколько заданий одновременно из одного сеанса терминала, но только один из них будет текущим. Текущему заданию позволено писать в терминал и считывать с него.
Фоновым заданиям, пытающимся получить доступ к терминалу, посылаются сигналы, которые обычно приостанавливают процесс. Командные интерпретаторы Кого зпе11 (Ы) и С зпе11 (сзп) 16~ используют сигналы управления заданиями для манипулирования заданиями, посылая эти сигналы текущим и фоновым заданиям, приостанавливая и возобновляя их работу.
Более подробно об управлении заданиями будет рассказано в разделе 4.9.1. В заключение отметим, что система 4ВВР позволяет автоматически перезапускать медленные системные вызовы, выполнение которых было прервано сигналами. Медленные вызовы включают в себя функции геад и ьуп1е, осуществляющие чтение и запись на символьные устройства, а также сетевые соединения, каналы, вызовы ьуа11, ьуа11р1п', 1ос11. Если один из этих вызовов прерывается сигналом, происходит его автоматический перезапуск после возврата из обработчика сигнала вместо прерывания работы с ошибкой НМТй. В системе 4.3ВЗР добавлен вызов з191пгеггврг, позволяющий выборочно разрешить или запретить такую возможность для каждого сигнала отдельно.
Интерфейс сигналов системы ВБР является весьма гибким и мощным. Его основным недостатком остается несовместимость с оригинальным интерфейсом систем корпорации АТЛЕТ (и даже с вариантом, представленным в 5Ъ'КЗ, хотя эта система была создана позже). Это дало возможность сторонним производителям предлагать различные библиотечные интерфейсы, которые пытались удовлетворить приверженцев обеих ветвей генеалогического дерева (ЛЯ1Х. Позже в системе 5ЧК4 был представлен интерфейс, совместимый со стандартом РОЯ1Х и при этом обладающий совместимостью с предыдущими реализациями 5узгет Ч и семантикой, принятой в ОС ВЗР. ' Поддержка управления заданиями впервые появилась в 4ЛВ5Р.
160 Глава 4. Сигналы и управление сеансами 4.5. Сигналы в ВЧН4 Операционная система 5УК4 предлагает набор системных вызовов 111), которые обеспечивают универсальные возможности обработки сигналов как ОС 5ЧВЗ, так и ВБП, а также поддерживается устаревший механизм ненадежных сигналов. Ниже представлены основные функции 5ЧК4 для работы с сигналами. + з1дргосаай(лонг, зе1р, озетр); + Аргумент зетр используется для изменения маски блокируемых сигналов. Если лоуг имеет значение 516 В(.ОСК, то маска зетр объединяется операцией ИЛИ с существующей.
Если йоа определено как 516 ОМВ(.06К, то сигналы, заданные в зетр, деблокируются по существующей маске блокированных сигналов. Если лов равняется 516 56ТМА5К, то происходит замена текущей маски на набор, определенный в зетр. При возврате из функции озетр содержит значение маски перед модификацией. + з1да(тзтасК(зтасК, оЫ зтасК); + Задает новый стек зтасК для обработки сигналов. Альтернативный стек (если он требуется) необходимо определять перед установкой обработчика.
Остальные обработчики используют стек, заданный по умолчанию. После возврата из функции в переменной оЫ зтасК содержится указатель на предыдущий альтернативный стек. + з(дзцзрелд(з(дщай); + Устанавливает маску блокируемых сигналов в значение з1дшай и переводит процесс в состояние сна до тех пор, пока этому процессу не будет отправлен сигнал, который не игнорируется и не заблокирован. Если такой сигнал был послан и при изменении маски он будет разблокирован, произойдет немедленный выход из функции. + з(дрелг(1лд(ветр); + Возвращает в зетр набор сигналов, ожидающих процесс.
Вызов не производит никаких изменений в состоянии сигналов и используется только для получения информации. + з(дзепг(зе1(ргосзет„з1д); + Расширенная версия Ый. Посылает сигнал гйд набору процессов, заданных в ргосзек + з1дасйоп(з(дпо, асК оас1); + Определяет обработчик для сигнала з1дпо. Является аналогом вызова з1дчес в ОС В50. Аргумент аст указывает на структуру з1дасбоп, содержащую диспозицию сигналов (516 16й, 516 ОВ. или адрес обработчя- 4.6. Реализация сигналов 161 ка), маску, ассоциированную с сигналом (аналогичную маске вызова 519уес), а также один или несколько следующих флагов: 5А 5161МЕО 5А МООЕЕЕй 5А НЕ5ЕТНАМО + Флаги 5А МООЕЕЕК и 5А КЕ5ЕТНАМО используются для совместимости с изначальной реализацией механизма ненадежных сигналов. Во всех случаях переменная оас1 возвращает данные, установленные перед вызовом 519асбоп.
+ Интерфейс совместимости + Для обеспечения совместимости с предыдущими версиями система 5Ъ'К4 также поддерживает вызовы 519па1, гйдзет, 519поЫ, 519гесзе, 51919поге и 519рапзе. Системы, не требующие совместимости на бинарном уровне, могут реализовывать эти вызовы в виде библиотечных функций, Все перечисленные системные вызовы (кроме указанных в последнем пункте списка) полностью удовлетворяют стандарту РО31Х.1 по имени, передаваемым параметрам и семантике. 4.6. Реализация сигналов Для эффективной реализации сигналов ядру необходимо содержать некоторое состояние в области и и в структуре ргос.
В этом разделе описывается реализация сигналов в системе 5'тгК4, которая отличается от аналогичного набора ОС В51) именами некоторых переменных и функций. Область и содержит информацию, требующуюся для правильного запуска обработчиков сигналов, которую составляют нижеперечисленные поля области и. 5А МОСС05ТОР 5А кЕ5ТАкТ 5А ОМ5ТАСК 5А моссОауА11 Не генерировать сигнал 516СНСО, когда процесс-потомок приостановлен Автоматический рестарт системного вызова при прерывании его сигналом Обработка сигнала с альтернативным стеком, если такой стек был указан через йданиасй Используется только с 516СНСО.
Просит систему не создавать процессы-зомби, если потомки вызывающего процесса завершают свою работу. Если процесс далее вызовет иа1ц то он будет находиться в рехгиме охгидания до тех пор, пока не завершат работу все его потомки Обеспечивает дополнительную информацию для обработчика сигнала. Используется для обработки аппаратных исключений и т. д. Позволяет не блокировать автоматически сигнал в течение выполнения его обработчика Сбрасывает действия на заданные по умолчанию перед вызовом обработчика 162 Глава 4. Сигналы и управление сеансами Вектор обработчиков для каждого сигнала Маски сигналов, ассоциированные с каждым обработчиком Указатель на альтернативный стек сигнала Маска сигналов, обрабатываемых с альтернативным стеком и а|два|В а т|дшаа|сЦ а йдапыасй а а!дспетас|с ц 0|от!9 Набор обработчиков, который должен имитировать устаревший механизм ненадежных сигналов Структура ргос содержит определенные поля, относящиеся к созданию и отправке сигналов, в том числе: Текущий сигнал, в данный момент обрабатываемый Маска ожидающих сигналов Маска блокируемых сигналов Маска игнорируемых сигналов р сцгт|д Р-а|9 р Ьо|б р |дпсге Рассмотрим далее реализации па уровне ядра различных функций, относящихся к доставке сигналов.