Наборы сигналов: и связанные функции — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Наборы сигналов: и связанные функции

2021-01-29 125
Наборы сигналов: и связанные функции 0.00 из 5.00 0 оценок
Заказать работу

 

Маска сигналов процесса является списком сигналов, которые процесс в настоящее время заблокировал. Сила POSIX API в том, что маской сигналов процесса можно манипулировать атомарно, как единым целым.

Маска сигналов процесса программно представляется с помощью набора сигналов. Это тип. Концептуально он представляет собой просто битовую маску, причем значения 0 и 1 представляют отсутствие или наличие определенного сигнала в маске.

 

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

 

Эти функции следующие:

 

Освобождает набор сигналов. По возвращении не содержит сигналов. Возвращает 0 в случае успеха и ‑1 при ошибке.

 

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

 

Добавляет к маске сигналов процесса в. Возвращает 0 в случае успеха и ‑1 при ошибке.

 

Удаляет из маски сигналов процесса в. Возвращает 0 в случае успеха и ‑1 при ошибке.

 

Возвращает true/false, если присутствует или не присутствует в.

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

 

Управление маской сигналов: и др.

 

Маска сигналов процесса вначале пуста ‑ заблокированных сигналов нет. (Это упрощение; см. раздел 10.9 «Сигналы, передающиеся через и.) Три функции позволяют работать непосредственно с маской сигналов процесса:

 

Функции следующие:

 

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

Объединить сигналы в с маской сигналов текущего процесса. Новая маска является объединением текущей маски и.

Удалить сигналы в из маски сигналов процесса. Это не представляет проблемы, если содержит сигнал, который не содержится в текущей маске сигналов процесса.

Заменить маску сигналов процесса содержимым.

Если равен, a – нет, значение неважно. Эта комбинация получает маску сигналов текущего процесса, не меняя ее. (Это явно выражено в стандарте POSIX, но не ясно из справочной страницы GNU/Linux.)

 

Эта функция позволяет увидеть, какие сигналы ожидают решения; т.е. заполнен этими сигналами, которые были посланы, но они еще не доставлены, поскольку заблокированы.

 

Эта функция временно заменяет маску сигналов процесса содержимым, а затем приостанавливает процесс, пока сигнал не будет получен. По определению, заставить функцию вернуться может только сигнал, не находящийся в (см. раздел 10.7 «Сигналы для межпроцессного взаимодействия).

 

Перехват сигналов:

 

Наконец мы готовы взглянуть на функцию. Эта функция сложна, и мы намеренно опускаем множество деталей, которые предназначены для специального использования. Стандарт POSIX и справочная страница sigaction (2) предоставляют все подробности, хотя вы должны тщательно прочесть и то, и другое, чтобы полностью все усвоить.

 

Аргументы следующие:

 

Интересующий сигнал, как в случае с другими функциями обработки сигналов.

 

Определение нового обработчика для сигнала.

 

Определение текущего обработчика. Если не, система до установки заполняет. может быть, в этом случае заполняется, но больше ничего не меняется.

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

 

 

Поля следующие:

 

Набор дополнительных сигналов для блокирования при запуске функции обработчика. Таким образом, когда вызывается обработчик, общий набор заблокированных сигналов является объединением сигналов в маске процесса, сигналов в и, если сброшен,.

 

Флаги, контролирующие обработку сигнала ядром. См. обсуждение далее.

 

Указатель на «традиционную» функцию обработчика. У нее такой же прототип (возвращаемый тип и список параметров), как у функции обработчика для, и.

 

Указатель на функцию обработчика «нового стиля». Функция принимает три аргумента, которые вскоре будут описаны.

Которая из функций и используется, зависит от флага в. Когда имеется, используется; в противном случае используется. Как POSIX, так и справочная страница GNU/Linux указывают, что эти два поля могут перекрываться в памяти (т. е. быть частью). Таким образом, никогда не следует использовать оба поля в одной и той же.

Поле составляется с помощью побитового ИЛИ значений одного или более флагов, перечисленных в табл. 10.3.

 

Таблица 10.3. Значения флагов для

 

 Флаг Значение
  Этот флаг имеет смысл лишь для. Когда он установлен, родитель не получает сигнал при остановке порожденною процесса сигналами,, или. Эти сигналы обсуждаются позже, в разделе 10.8.2
  Этот флаг имеет смысл лишь для. Его поведение сложно. Мы отложим объяснение на потом, см. раздел 10.8.3
  Обычно данный сигнал блокируется, когда вызывается обработчик сигнала. Когда установлен один из этих флагов, данный сигнал не блокируется при запуске обработчика является официальным именем POSIX данного флага (которое и следует использовать)
  Альтернативное имя для [110]
  Обработчик сигнала принимает три аргумента. Как упоминалось, при данном установленном флаге должно использоваться поле вместо.
  Это продвинутая возможность. Обработчики сигналов могут вызываться с использованием предоставленной пользователем памяти в качестве «альтернативного стека сигнала». Эта память даётся ядру для подобного использования посредством (см. sigaltstack (2)). Эта особенность больше не описывается в данной книге
  Этот флаг обеспечивает поведение V7: после вызова обработчика восстанавливается действие сигнала по умолчанию. Официальным именем POSIX флага (которое следует использовать) является
  Альтернативное имя для
  Этот флаг предоставляет семантику BSD: системные вызовы, которые могут завершиться с ошибкой и которые получают этот сигнал, запускаются повторно.

Когда в установлен флаг, поле является указателем на функцию, объявленную следующим образом:

 

Структура _t предоставляет изобилие сведений о сигнале:

 

 

Поля, и доступны для всех сигналов. Другие поля могут быть членами объединения, поэтому должны использоваться лишь для тех сигналов, для которых они определены. В структуре могут быть также и другие поля.

Почти все поля предназначены для расширенного использования. Все подробности содержатся в стандарте POSIX и справочной странице sigaction (2). Однако, мы можем описать простое использование поля.

Для,,,,, и поле si_code может принимать любое из набора предопределенных значений, специфичных для каждого сигнала, указывая на причину появления сигнала. Откровенно говоря, детали несколько чрезмерны; повседневному коду на самом деле нет необходимости иметь с ними дела (хотя позже мы рассмотрим значения для). Для всех остальных сигналов член имеет одно из значений из табл. 10.4.

 

Таблица 10.4. Значения происхождения сигнала для

 

 Значение Только GLIBC Смысл
    Асинхронный ввод/вывод завершен (расширенный).
  Сигнал послан ядром.
    Состояние очереди сообщений изменилось (расширенный.)
    Сигнал послан из (расширенный).
   поставлен в очередь (расширенный).
    Время таймера истекло
    Сигнал послан функцией. и также могут его вызвать, но это не обязательно.

В особенности полезно значение; оно позволяет обработчику сигнала сообщить, был ли сигнал послан функциями или (описываются далее). Вы можете использовать эту информацию, чтобы избежать повторного вызова или.

Третий аргумент обработчика сигнала с тремя аргументами, t, является расширенной возможностью, которая больше не обсуждается в данной книге.

Наконец, чтобы увидеть в действии, исследуйте полный исходный код обработчика сигнала для:

 

 

Вот код в, который помещает обработчик на свое место:

 

Мы заметили, что строки 2216–2219 и 2221 могут быть замещены одним вызовом:;

Мы не знаем, почему код написан именно таким способом.

Интерес представляют также строки 2233–2234 и 2236–2237, которые показывают правильный способ проверки того, игнорируется ли сигнал, и для установки обработчика лишь в том случае, если сигнал не игнорируется.

 

ЗАМЕЧАНИЕ. Функции API и не должны использоваться вместе для одного и того же сигнала. Хотя POSIX идет на большие длинноты, чтобы сначала сделать возможным использование, получить, представляющую диспозицию, и восстановить ее, все равно это плохая мысль. Код будет гораздо проще читать, писать и понимать, если вы используете одну функцию или другую взаимоисключающим образам

 

 


Поделиться с друзьями:

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.024 с.