Сигналы
Категория: Управление процессами | Автор: admin | 30-09-2009, 04:14 | Просмотров: 3877

Сигналы — это запросы на прерывание на уровне процессов. В UNIX определено свыше тридцати различных сигналов, и они находят самое разное применение:

  • сигналы могут посылаться от одного процесса к другому как средство межзадачного взаимодействия;

  • сигналы могут посылаться драйвером терминала для уничтожения или приостанова процессов, когда пользователь нажимает специальные комбинации клавиш, такие как <Control-C> и <Control-Z>;

  • сигналы могут посылаться пользователем или администратором с помощью команды kill;

  • сигналы могут посылаться ядром, когда процесс выполняет нелегальную инструкцию, например деление на ноль.

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

 

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

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

В табл. 4.1 перечислены сигналы, представляющие интерес для системного администратора. Традиционно имена сигналов записываются прописными буквами. В программах на языке С к именам добавляется префикс SIG (например, SIGHUP).

 

Таблица 4.1. Сигналы, которые должны быть известны каждому администратору

No

Имя

Описание

Реакция по умолчанию

Перехваты вается?

Блокируется?

Дамп памяти?

1

HUP

Отбой

Завершение

Да

Да

Нет

2

INT

Прерывание

Завершение

Да

Да

Нет

3

QUIT

Выход

Завершение

Да

Да

Да

9

KILL

Уничтожение

Завершение

Нет

Нет

Нет

1

BUS

Ошибка на шине

Завершение

Да

Да

Да

 

SEGV

Ошибка сегментации

Завершение

Да

Да

Да

15

TERM

Программное завершение

Завершение

Да

Да

Нет

1

STOP

Останов

Останов

Нет

Нет

Нет

1

TSTP

Сигнал останова, посылаемый с клавиатуры

Останов

Да

Да

Нет

 

CONT

Продолжение после останова

Игнорируется

Да

Нет

Нет

1

WINCH

Изменение окна

Игнорируется

Да

Да

Нет

1

USR1

Определяется пользователем

Завершение

Да

Да

Нет

1

USR2

Определяется пользователем

Завершение

Да

Да

Нет

1 В разных системах разный (см. файл /usr/include/signal.h или раздел man signal интерактивного руководства).

Имеются и другие сигналы, не показанные в табл. 4.1, большинство из которых сообщает о всяких загадочных ошибках, например "неверная инструкция". По умолчанию такие сигналы, как правило, приводят к завершению программы и созданию дампа памяти. Перехват и блокирование обычно разрешены, так как есть достаточно "умные" программы, которые всегда стараются устранять последствия возникающих ошибок.

Сигналы BUS и SEGV также посылаются в случае ошибок. Мы включили их в таблицу, поскольку они чрезвычайно распространены: в 99% случаев программа аварийно завершается именно из-за них. Сами по себе эти сигналы не имеют диагностической ценности. Они лишь указывают на то, что была произведена попытка неправильного обращения к памяти.

Большинство эмуляторов терминалов посылают сигнал WINCH, когда происходит изменение их конфигурационных параметров (например, числа линий на виртуальном терминале). Это позволяет программам, которые тесно связаны с терминалами (в основном текстовым редакторам), автоматически переконфигурировать себя в ответ на изменения.

Сигналы KILL и STOP нельзя ни перехватить, ни блокировать, ни проигнорировать. Сигнал KILL уничтожает процесс, которому он посылается, а сигнал STOP приостанавливает выполнение процесса до получения сигнала CONT. Сигнал CONT можно перехватить и проигнорировать, но нельзя блокировать.

Сигнал TSTP представляет собой "облегченную" версию сигнала STOP. Проще всего описать его как запрос на останов. Он генерируется драйвером терминала при нажатии пользователем комбинации клавиш <Ctrl-Z>. Про­граммы, обрабатывающие этот сигнал, обычно выполняют операции очистки, а затем посылают сами себе сигнал STOP. С другой стороны, сигнал TSTP можно просто проигнорировать, чтобы сделать программу невосприимчивой к случайным нажатиям клавиш.

Может показаться, что сигналы KILL, INT, HUP, QUIT и TERM означают одно и то же, но на самом деле они используются совершенно по-разному:

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

  • Сигнал INT посылается драйвером терминала при нажатии пользователем клавиш <Ctrl-C>. Он запрашивает завершение текущей операции. Простые программы должны прекратить свою работу (если они перехватывают этот сигнал) или позволить уничтожить себя стандартному обработчику сигнала. Программы, в которых есть режим командной строки, должны прервать текущую операцию, произвести очистку и снова перейти в режим ожидания.

  • Сигнал TERM представляет собой запрос на полное завершение программы. Предполагается, что процесс, который получит этот сигнал, произведет очистку и прекратит работу.

  • У сигнала HUP есть две распространенные интерпретации. Во-первых, многие демоны понимают его как команду сброса. Если демон способен повторно прочитать свой конфигурационный файл и адаптироваться к изменениям без перезапуска, сигнал HUP позволяет менять его поведение. Во-вторых, данный сигнал иногда генерируется драйвером терминала при попытке "очистить" (т.е. удалить) процессы, связанные с конкретным терминалом. Это происходит, например, при завершении сеанса работы с терминалом или когда модем внезапно разрывает соединение (отсюда название "hang-up" — отбой). Интерпретаторы семейства С shell (csh, tcsh и др.) обычно делают фоновые процессы невосприимчивыми к сигналу HUP, чтобы они могли продолжать свою работу, даже когда пользователь выходит из системы. Пользователи интерпретаторов семейства Bourne shell (sh, ksh, bash) могут эмулировать данное поведение с помощью команды nohup.

  • Сигнал QUIT напоминает сигнал TERM, но отличается от него тем, что по умолчанию стандартный обработчик создает дамп памяти.

Сигналы USR1 и USR2 не имеют стандартного назначения. Ими можно пользоваться в различных ситуациях. Например, демон named интерпретирует их как запросы на выбор уровня отладки.



 (голосов: 2)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page