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

• Процесс останавливается — выполнение процесса приостанавливается.

• Выполнение процесса возобновляется после предшествовавшей приостановки.

Для каждого конкретного сигнала программа может изменить действие, выполняемое по его получении. Это называют установкой диспозиции сигнала. Программа может установить одну из нижеперечисленных диспозиций сигнала.

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

• Сигнал игнорируется. Эта инструкция используется для сигналов, действие по умолчанию для которых — завершение процесса.

• Выполняется обработчик сигнала.

Обработчик сигнала — функция, написанная программистом и выполняющая нужные действия при получении сигнала. Например, для оболочки установлен обработчик сигнала SIGINT (генерируемого символом прерывания, Ctrl+C), заставляющий оболочку прекратить выполнение текущей задачи и вернуть управление в основной цикл так, что пользователь опять видит на экране приглашение на ввод команды. Оповещение ядра о необходимости активации функции обработчика сигнала называют установкой или настройкой обработчика сигнала. Когда в ответ на получение сигнала программа активирует соответствующий обработчик, мы говорим, что сигнал был обработан или, что синонимично, перехвачен.

Обратите внимание, что невозможно установить диспозицию сигнала таким образом, чтобы он завершал процесс или сбрасывал дамп ядра (за исключением случая, когда это является диспозицией по умолчанию). Максимум, как мы можем приблизиться к этому, — это установить обработчик сигнала, который вызывает одну из двух функций: exit() или abort(). Функция abort() (см. подраздел 21.2.2) генерирует для процесса сигнал SIGABRT, который приводит к сбросу дампа ядра и завершению процесса.

Характерный для Linux файл /proc/PID/status содержит различные поля битовых масок, которые можно изучить для выяснения того, каким образом процесс обрабатывает сигналы. Битовые маски представлены в виде шестнадцатеричных чисел, при этом наименьший бит представляет сигнал номер 1, а следующий бит влево представляет сигнал номер 2 и т. д. Это поля SigPnd (ожидающие сигналы по потокам), ShdPnd (ожидающие сигналы процесса, начиная с версии Linux 2.6), SigBlk (заблокированные сигналы), SigIgn (игнорируемые сигналы), SigCgt (перехваченные сигналы). (Различие между сигналами SigPnd и ShdPnd станет ясным после того, как мы рассмотрим обработку сигналов в многопоточных процессах в разделе 33.2.) Аналогичная информация может быть получена с использованием различных параметров команды ps(1).

Сигналы, появившиеся в самых ранних реализациях UNIX, на сегодняшний день подверглись нескольким существенным изменениям. В ранних реализациях при определенных обстоятельствах сигналы могли быть потеряны (то есть не доставлены в целевой процесс). Более того, несмотря на то, что средства для блокировки сигналов при выполнении важного кода предоставлялись, они не были надежными. Эти проблемы были исправлены в системе 4.2BSD, которая предоставляла так называемые надежные сигналы. (Еще одной инновацией системы BSD была реализация дополнительных сигналов для поддержки управления задачами оболочки, которые будут описаны в разделе 34.7.)

В систему System V была добавлена надежная семантика сигналов, однако при этом использовалась модель, несовместимая с BSD. Эти несовместимости были разрешены только с появлением стандарта POSIX.1-1990, который установил спецификацию надежных сигналов, по большей части основанную на модели BSD.

Мы рассматриваем детали надежных и ненадежных сигналов в разделе 22.7, а также вкратце описываем старые API сигналов BSD в разделе 22.13.

20.2. Типы сигналов и действия по умолчанию

Ранее мы говорили, что стандартные сигналы Linux пронумерованы от 1 до 31. Однако на странице справочника signal(7) приводится больше имен сигнала. Для этого есть несколько причин. Одни имена — просто синонимы иных имен и определяются только для обеспечения совместимости файлов исходного кода с другими реализациями UNIX. Другие имена определены, но не используются. В следующем списке приведено описание различных сигналов.

• SIGABRT — процессу отправляется данный сигнал при вызове функции abort() (см. подраздел 21.2.2). По умолчанию данный сигнал завершает процесс с дампом ядра. Это позволяет достичь той цели, для которой предназначен вызов функции abort(): создание дампа ядра для отладки.

Перейти на страницу:

Похожие книги