Сигнал (Unix)

Перейти к навигацииПерейти к поиску

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

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

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

Посылка сигналов

Сигналы посылаются:

  • из терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, Ctrl-\ SIGQUIT, а Ctrl-Z SIGTSTP);
  • ядром системы:
    • при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
    • ошибочных системных вызовах;
    • для информирования о событиях ввода-вывода;
  • одним процессом другому (или самому себе), с помощью системного вызова 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, но присутствующие на некоторых операционных системах.

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

SA_SIGINFO

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

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

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

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

Ссылки