А. Робачевский - Операционная система UNIX (1114671), страница 32
Текст из файла (страница 32)
раздел "Ограничения" далее в этой главе).Таблица 2.18. СигналыНазваниеДействие поумолчаниюЗавершитьЗавершить+согеИгнорироватьЗавершить+согеЗавершить+согеЗначениеСигнал отправляется, если процесс вызываетсистемный вызовСигнал отправляется, когда срабатывает тай%мер, ранее установленный с помощью систем%ных вызовов alarm(2) или setitimer(2).Сигнал свидетельствует о некоторой аппаратнойошибке. Обычно этот сигнал отправляется при об%ращении к допустимому виртуальному адресу, длякоторого отсутствует соответствующая физическаястраница. Другой случай генерации этого сигналаупоминался при обсуждении файлов, отображае%мых в память (сигнал отправляется процессу припопытке обращения к страницепамя%ти, лежащей за пределами файла).Сигнал, посылаемый родительскому процессупри завершении выполнения его потомка.Сигнал свидетельствует о попытке обращения кнедопустимому адресу или к области памяти, длякоторой у процесса недостаточно привилегий.Сигнал свидетельствует о возникновении осо%бых ситуаций, таких как деление на 0 или пере%полнение операции с плавающей точкой.www.books-shop.comПроцессыТаблица 2.18 (продолжение)НазваниеДействие поумолчаниюЗначениеЗавершитьСигнал посылается лидеру сеанса, связанномус управляющим терминалом, когда ядро обна%руживает, что терминал отсоединился (потерялинии).
Сигнал также посылается всем процес%сам текущей группы при завершении выполне%ния лидера.Этот сигнал иногда используется в качествепростейшего средства межпроцессного взаи%модействия. В частности, он применяется длясообщения демонам о необходимости обновитьконфигурационную информацию. Причина вы%бора именно сигнала SIGHUP заключается втом, что демон по определению не имеет управ%ляющего терминала и, соответственно, обычноне получает этого сигнала.SIGILLSIGINTSIGPIPEСигнал посылается ядром, если процесс попы%тался выполнить недопустимую инструкцию.ЗавершитьСигнал посылается ядром всем процессам те%кущей группы при нажатии клавиши прерывания<Ctrl>+<C>).ЗавершитьСигнал, при получении которого выполнениепроцесса завершается. Этот сигнал нельзя ниперехватить, ни игнорировать.ЗавершитьСигнал посылается при попытке записи в каналили сокет, получатель данных которого завер%шил выполнение (закрыл соответствующий де%скриптор).Сигнал отправляется при наступлении опреде%ленного события для устройства, которое явля%ется опрашиваемым.ЗавершитьИгнорироватьСигнал генерируется при угрозе потери питания.Обычно он отправляется, когда питание системыпереключается на источник бесперебойногопитания (UPS).SIGQUITЗавершить+согеSIGSTOPОстановитьСигнал посылается ядром всем процессам те%кущей группы при нажатии клавиш <Ctrl>+<\>.Сигнал отправляется всем процессам текущейгруппы при нажатии пользователем клавиш<Ctrl>+<Z>.
Получение сигнала вызывает оста%нов выполнения процесса.Завершить+согеСигнал отправляется ядром при попытке недо%пустимого системного вызова.www.books-shop.comГлава 2,164программирования UNIXТаблица 2.18 (окончание)НазваниеДействие поумолчаниюЗначениеSIGTERMЗавершитьСигнал обычно представляет своего рода пре%дупреждение, что процесс вскоре будет уничто%жен. Этот сигнал позволяет процессу соответст%вующим образом "подготовиться к смерти" —удалить временные файлы, завершить необхо%димые транзакции и т. д.
Команда kill(1) поумолчанию отправляет именно этот сигнал.SIGTTINОстановитьСигнал генерируется ядром (драйвером терми%нала) при попытке процесса фоновой группыосуществить чтение с управляющего терминала.SIGTTOUОстановитьСигнал генерируется ядром (драйвером терми%нала) при попытке процесса фоновой группыосуществить запись на управляющий терминал.ЗавершитьСигнал предназначен для прикладных задач какпростейшее средство межпроцессного взаимо%действия.ЗавершитьСигнал предназначен для прикладных задач какпростейшее средство межпроцессного взаимо%действия.Простейшим интерфейсом к сигналам UNIX является устаревшая, но по!прежнему поддерживаемая в большинстве систем функцияЭтафункция позволяет изменить диспозицию сигнала, которая по умолчаниюустанавливается ядром UNIX.
Порожденный вызовом fork(2) процесс на!следует диспозицию сигналов от своего родителя. Однако при вызовеехес(2) диспозиция всех перехватываемых сигналов будет установлена надействие по умолчанию. Это вполне естественно, поскольку образ новойпрограммы не содержит функции!обработчика, определенной диспозици!ей сигнала перед вызовом ехес(2). Функцияимеет следующееопределение:<signal.h>void (*signal (int sig, voidАргумент sig определяет сигнал, диспозицию которого нужно изменить.Аргументопределяет новую диспозицию сигнала, которой можетбыть определенная пользователем функция!обработчик или одно из сле!дующих значений:SIG_DFLУказывает ядру, что при получении процессом сигнала необходимовызвать системный обработчик, т.
е. выполнить действие по умолчанию.Указывает, что сигнал следует игнорировать. Напомним, что не все сиг%налы можно игнорировать.www.books-shop.comПроцессыВ случае успешного завершениявозвращает предыдущую диспо!зицию — это может быть функция!обработчик сигнала или системныезначенияилиВозвращаемое значение может быть ис!пользовано для восстановления диспозиции в случае необходимости.Использование функцииподразумевает семантику устаревшихили ненадежных сигналов. Процесс при этом имеет весьма слабые воз!можности управления сигналами. Во!первых, процесс не может заблоки!ровать сигнал, т.
е. отложить получение сигнала на период выполнениякритического участка кода. Во!вторых, каждый раз при получении сигна!ла, его диспозиция устанавливается на действие по умолчанию. Даннаяфункция и соответствующая ей семантика сохранены для поддержки ста!рых версий приложений. В связи с этим в новых приложениях следует из!бегать использования функции signal(3C). Тем не менее для простейшейиллюстрации использования сигналов, приведенный ниже пример исполь!зует именно этот интерфейс:<signal.h>static void{signo)сигнал{pauseВ этом примере изменена диспозиция трех сигналов: SIGINT, SIGUSR1 иПри получении сигнала SIGINT вызывается обработчикпри получении сигнала SIGUSR1 производится действие поумолчанию (процесс завершает работу), а сигналигнорируется.После установки диспозиции сигналов процесс запускает бесконечныйцикл, в процессе которого вызывается функцияПри получениисигнала, который не игнорируется,возвращает значение !1, а пере!менная errno устанавливается равной EINTR.
Заметим, что каждый раз приполучении сигнала SIGINT мы вынуждены восстанавливать требуемую дис!позицию, в противном случае получение следующего сигнала этого типавызвало бы завершение выполнения процесса (действие по умолчанию).www.books-shop.comГлава 2. Среда программирования UNIXПри запуске программы, получим следующий результат:$&[1] 8365PID порожденного процесса$ kill !SIGINT 8365Получен сигнал SIGINT$ kill8365Сигнал SIGINT перехваченСигнал SIGUSR2 игнорируется$ kill !SIGUSR1 8365User Signal 1•Сигнал SIGUSR1 вызывает завер[шение выполнения процесса$Для отправления сигналов процессу использована команданая в предыдущей главе.описан!Надежные сигналыСтандарт POSIX.
1 определил новый набор функций управления сигнала!на интерфейсеUNIX и лишенный рассмотренныхвыше недостатков.Модель сигналов, предложенная POSIX, основана на понятии набора сиг!налов (signal set), описываемого переменной типа s i g s e t _ t . Каждый битэтой переменной отвечает за один сигнал. Во многихтипимеет длину 32 бита, ограничивая количество возможных сигна!лов числом 32.Следующие функции позволяют управлять наборами сигналов:frincludeintintint*set, int*set, int signo);*set, intВ отличие от функцииизменяющей диспозицию сигналов, дан!позволяют модифицировать структуру данных s i g s e t t,определенную процессом.
Для управления непосредственно сигналами ис!дополнительные функции, которые мы рассмотрим позже.Функцияинициализирует набор, очищая все биты. Еслипроцесс вызываетто набор будет включать все сигналы, из!вестные системе. Функции sigaddset(3C) ипозволяют добавлятьили удалять сигналы набора.
Функцияпозволяет прове!рить, входит ли указанный параметром signo сигнал в набор.Вместофункциистандарт1 определяет функциюпозволяющую установить диспозицию сигналов, узнать ее те!кущее значение или сделать и то и другое одновременно. Функция имеетследующее определение:www.books-shop.comПроцессы167<signal.h>int sigaction (int sig,const struct sigaction *act,struct sigactionВся необходимая для управлением сигналами информация передается че!рез указатель на структуру sigaction, имеющую следующие поля:void (*sa_handler) ()void(int, siginfo_t *, void *)sigset_tintОбработчик сигнала sigОбработчик сигнала sigпри установленном флагеМаска сигналовФлагиПолеопределяет действие, которое необходимо предпринятьпри получении сигналов, и может принимать значенияSIG_DFLили адреса функции!обработчика.
Если значениеилиsa sigaction не равны NULL, то в полепередается набор сигна!лов, которые будут добавлены к маске сигналов перед вызовом обработчика.Каждый процесс имеет установленную маску сигналов, определяющую сиг!налы, доставка которых должна быть заблокирована. Если определенныйбит маски установлен, соответствующий ему сигнал будет заблокирован.После возврата из функции!обработчика значение маски возвращаетсяк исходному значению. Заметим, что сигнал, для которого установленафункция!обработчик, также будет заблокирован перед ее вызовом. Такойподход гарантирует, что во время обработки, последующее поступление оп!ределенных сигналов будет приостановлено до завершения функции. Какправило, UNIX не поддерживает очередей сигналов, и это значит, что бло!кировка нескольких однотипных сигналов в конечном итоге вызовет достав!куодного.Полеопределяет флаги, модифицирующие доставку сигнала.Оно может принимать следующие значения:Если определена функция%обработчик сигнала, и с помощью функцииsigaltstack(2) заданстек для функции%обработчика,то при обработке сигнала будет использоваться этот стек.