• Генерируется
• Процесс
• Выполнение процесса
Для каждого конкретного сигнала программа может изменить действие, выполняемое по его получении. Это называют установкой
• Следует выполнить
• Сигнал
• Выполняется
Обработчик сигнала — функция, написанная программистом и выполняющая нужные действия при получении сигнала. Например, для оболочки установлен обработчик сигнала SIGINT (генерируемого символом
Обратите внимание, что невозможно установить диспозицию сигнала таким образом, чтобы он
Характерный для Linux файл /proc/PID/status содержит различные поля битовых масок, которые можно изучить для выяснения того, каким образом процесс обрабатывает сигналы. Битовые маски представлены в виде шестнадцатеричных чисел, при этом наименьший бит представляет сигнал номер 1, а следующий бит влево представляет сигнал номер 2 и т. д. Это поля SigPnd (ожидающие сигналы по потокам), ShdPnd (ожидающие сигналы процесса, начиная с версии Linux 2.6), SigBlk (заблокированные сигналы), SigIgn (игнорируемые сигналы), SigCgt (перехваченные сигналы). (Различие между сигналами SigPnd и ShdPnd станет ясным после того, как мы рассмотрим обработку сигналов в многопоточных процессах в разделе 33.2.) Аналогичная информация может быть получена с использованием различных параметров команды ps(1).
Сигналы, появившиеся в самых ранних реализациях UNIX, на сегодняшний день подверглись нескольким существенным изменениям. В ранних реализациях при определенных обстоятельствах сигналы могли быть потеряны (то есть не доставлены в целевой процесс). Более того, несмотря на то, что средства для блокировки сигналов при выполнении важного кода предоставлялись, они не были надежными. Эти проблемы были исправлены в системе 4.2BSD, которая предоставляла так называемые
В систему System V была добавлена надежная семантика сигналов, однако при этом использовалась модель, несовместимая с BSD. Эти несовместимости были разрешены только с появлением стандарта POSIX.1-1990, который установил спецификацию надежных сигналов, по большей части основанную на модели BSD.
Мы рассматриваем детали надежных и ненадежных сигналов в разделе 22.7, а также вкратце описываем старые API сигналов BSD в разделе 22.13.
Ранее мы говорили, что стандартные сигналы Linux пронумерованы от 1 до 31. Однако на странице справочника signal(7) приводится больше имен сигнала. Для этого есть несколько причин. Одни имена — просто синонимы иных имен и определяются только для обеспечения совместимости файлов исходного кода с другими реализациями UNIX. Другие имена определены, но не используются. В следующем списке приведено описание различных сигналов.
• SIGABRT — процессу отправляется данный сигнал при вызове функции abort() (см. подраздел 21.2.2). По умолчанию данный сигнал завершает процесс с дампом ядра. Это позволяет достичь той цели, для которой предназначен вызов функции abort(): создание дампа ядра для отладки.