Сигнал в операционных системах семейства Unix — асинхронное уведомление процесса о каком-либо событии, один из основных способов взаимодействия между процессами. Когда сигнал послан процессу, операционная система прерывает выполнение процесса, при этом, если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале, если процесс не установил обработчик, то выполняется обработчик по умолчанию.

Названия сигналов «SIG…» являются числовыми константами (макроопределениями Си) со значениями, определяемыми в заголовочном файле signal.h. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill позволяет задавать сигнал как числом, так и символьным обозначением.

Спецификация сигналов включена в стандарты POSIX.

Посылка сигналов Сигналы посылаются: из терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, Ctrl-\ SIGQUIT, а Ctrl-Z SIGTSTP); ядром системы: при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.); ошибочных системных вызовах; для информирования о событиях ввода-вывода; одним процессом другому (или самому себе), с помощью системного вызова kill(), в том числе: из shell, утилитой /bin/kill.

Сигналы не могут быть посланы завершившемуся процессу, находящемуся в состоянии «зомби».

Обработка сигналов Обработчик по умолчанию для большинства сигналов завершает выполнение процесса. Для альтернативной обработки всех сигналов, за исключением SIGKILL и SIGSTOP, процесс может назначить свой обработчик или игнорировать их возникновение модификацией своей сигнальной маски. Единственное исключение — процесс с pid 1 (init), который имеет право игнорировать или обрабатывать любые сигналы, включая KILL и STOP.

Безопасность Процесс (или пользователь из оболочки) с эффективным UID, не равным 0 (UID суперпользователя), может посылать сигналы только процессам с тем же UID.

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

+НазваниеПортируемый кодДействие по умолчаниюОписаниеТипSIGABRT6Завершение с дампом памятиСигнал, посылаемый функцией abort()УправлениеSIGALRM14ЗавершениеСигнал истечения времени, заданного alarm()УведомлениеSIGBUS—Завершение с дампом памятиНеправильное обращение в физическую памятьИсключениеSIGCHLD—ИгнорируетсяДочерний процесс завершен или остановленУведомлениеSIGCONT—Продолжить выполнениеПродолжить выполнение ранее остановленного процессаУправлениеSIGFPE8Завершение с дампом памятиОшибочная арифметическая операцияИсключениеSIGHUP1ЗавершениеЗакрытие терминалаУведомлениеSIGILL4Завершение с дампом памятиНедопустимая инструкция процессораИсключениеSIGINT2ЗавершениеСигнал прерывания (Ctrl-C) с терминалаУправлениеSIGKILL9ЗавершениеБезусловное завершениеУправлениеSIGPIPE13ЗавершениеЗапись в разорванное соединение (пайп, сокет)УведомлениеSIGQUIT3Завершение с дампом памятиСигнал «Quit» с терминала (Ctrl-\)УправлениеSIGSEGV11Завершение с дампом памятиНарушение при обращении в памятьИсключениеSIGSTOP—Остановка процессаОстановка выполнения процессаУправлениеSIGTERM15ЗавершениеСигнал завершения (сигнал по умолчанию для утилиты kill)УправлениеSIGTSTP—Остановка процессаСигнал остановки с терминала (Ctrl-Z).УправлениеSIGTTIN—Остановка процессаПопытка чтения с терминала фоновым процессомУправлениеSIGTTOU—Остановка процессаПопытка записи на терминал фоновым процессомУправлениеSIGUSR1—ЗавершениеПользовательский сигнал № 1ПользовательскийSIGUSR2—ЗавершениеПользовательский сигнал № 2ПользовательскийSIGPOLL—ЗавершениеСобытие, отслеживаемое poll()УведомлениеSIGPROF—ЗавершениеИстечение таймера профилированияОтладкаSIGSYS—Завершение с дампом памятиНеправильный системный вызовИсключениеSIGTRAP5Завершение с дампом памятиЛовушка трассировки или брейкпоинтОтладкаSIGURG—ИгнорируетсяНа сокете получены срочные данныеУведомлениеSIGVTALRM—ЗавершениеИстечение «виртуального таймера»УведомлениеSIGXCPU—Завершение с дампом памятиПроцесс превысил лимит процессорного времениИсключениеSIGXFSZ—Завершение с дампом памятиПроцесс превысил допустимый размер файлаИсключение+

Также есть сигналы, не определённые в POSIX, но присутствующие в некоторых операционных системах.

. Посылается процессу, когда запрос статуса (info) получен от управляющего терминала.

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

SA_SIGINFO

Обычно обработчик сигнала получает только один аргумент — номер сигнала (это позволяет использовать одну функцию-обработчик для нескольких сигналов). Если при задании обработчика сигнала (функцией sigaction()) указать опцию SA_SIGINFO, то в обработчик будут переданы ещё два аргумента: указатель на структуру siginfo_t, включающую: битовую маску дополнительных «кодов сигнала», определяющих причину его возникновения; идентификатор процесса (PID), пославшего сигнал; эффективный идентификатор пользователя (UID), от имени которого выполняется процесс (например, утилита kill), пославший сигнал; адрес инструкции, в которой возникло исключение; и т. п. указатель на «машинный контекст» на момент возникновения сигнала (со «стеком сигнала» — дополнительными данными, которые помещаются в стек при вызове некоторых сигналов-исключений).

Большинство дополнительных кодов специфично для каждого сигнала. Коды, общие для всех сигналов:

+КодОписаниеSI_USERСигнал послан функцией kill() (или утилитой kill)SI_QUEUEСигнал послан функцией sigqueue()SI_TIMERСигнал послан по истечении времени, установленного функцией timer_settime()SI_ASYNCIOСигнал послан по завершении запроса на «асинхронный ввод-вывод»SI_MESGQСигнал послан по появлению сообщения в пустой «очереди сообщений Unix»+

Ссылки Signal Concepts — Концепция сигналов (IEEE Std 1003.1, 2004 Edition) signal.h — Описание структур и констант, связанных с сигналами (IEEE Std 1003.1, 2004 Edition) Правила использования сигналов в Unix — «Правила использования сигналов в Unix» (Сообщение в конференции RU.UNIX.PROG)

Категория:POSIX Категория:Сигналы межпроцессного взаимодействия