Linux. Signals: различия между версиями

Материал из Wiki
Перейти к навигации Перейти к поиску
(Новая страница: «Категория:Self-education __ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__»)
 
Строка 1: Строка 1:
[[Категория:Self-education]]
[[Категория:Self-education]]
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__
Сигнал в операционных системах семейства Unix — асинхронное уведомление процесса о каком-либо событии, один из основных способов взаимодействия между процессами. Когда сигнал послан процессу, операционная система прерывает выполнение процесса, при этом, если процесс установил собственный ''обработчик сигнала'', операционная система запускает этот обработчик, передав ему информацию о сигнале, если процесс не установил обработчик, то выполняется обработчик по умолчанию.
Названия сигналов «SIG…» являются числовыми константами (макроопределениями Си) со значениями, определяемыми в заголовочном файле <code>signal.h</code>. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита <code>kill</code> позволяет задавать сигнал как числом, так и символьным обозначением.
Спецификация сигналов включена в стандарты POSIX.
== Содержание ==
* 1Посылка сигналов
* 2Обработка сигналов
* 3Безопасность
* 4Классификация сигналов
* 5SA_SIGINFO
* 6Ссылки
== Посылка сигналов ==
[<nowiki/>[[Сигнал (Unix)&veaction=edit&section=1|править]] | [[Сигнал (Unix)&action=edit&section=1|править код]]]
Сигналы посылаются:
* из терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, Ctrl-\ SIGQUIT, а Ctrl-Z SIGTSTP);
* ядром системы:
** при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
** ошибочных системных вызовах;
** для информирования о событиях ввода-вывода;
* одним процессом другому (или самому себе), с помощью системного вызова <code>kill()</code>, в том числе:
** из shell, утилитой <code>/bin/kill</code>.
Сигналы не могут быть посланы завершившемуся процессу, находящемуся в состоянии «зомби».
== Обработка сигналов ==
[<nowiki/>[[Сигнал (Unix)&veaction=edit&section=2|править]] | [[Сигнал (Unix)&action=edit&section=2|править код]]]
Обработчик по умолчанию для большинства сигналов завершает выполнение процесса. Для альтернативной обработки всех сигналов, за исключением SIGKILL и SIGSTOP, процесс может назначить свой обработчик или игнорировать их возникновение модификацией своей ''сигнальной маски''. Единственное исключение — процесс с pid 1 (init), который имеет право игнорировать или обрабатывать любые сигналы, включая KILL и STOP.
== Безопасность ==
[<nowiki/>[[Сигнал (Unix)&veaction=edit&section=3|править]] | [[Сигнал (Unix)&action=edit&section=3|править код]]]
Процесс (или пользователь из оболочки) с эффективным UID, не равным 0 (UID суперпользователя), может посылать сигналы только процессам с тем же UID.
== Классификация сигналов ==
[<nowiki/>[[Сигнал (Unix)&veaction=edit&section=4|править]] | [[Сигнал (Unix)&action=edit&section=4|править код]]]
POSIX определяет 28 сигналов, которые можно классифицировать следующим образом:
{| class="wikitable sortable"
|+
!Название
!Портируемый код
!Действие по умолчанию
!Описание
!Тип
|-
|SIGABRT
|6
|Завершение с дампом памяти
|Сигнал, посылаемый функцией <code>abort()</code>
|Управление
|-
|SIGALRM
|14
|Завершение
|Сигнал истечения времени, заданного <code>alarm()</code>
|Уведомление
|-
|SIGBUS
|—
|Завершение с дампом памяти
|Неправильное обращение в физическую память
|Исключение
|-
|SIGCHLD
|—
|Игнорируется
|Дочерний процесс завершен или остановлен
|Уведомление
|-
|SIGCONT
|—
|Продолжить выполнение
|Продолжить выполнение ранее остановленного процесса
|Управление
|-
|SIGFPE
|8
|Завершение с дампом памяти
|Ошибочная арифметическая операция
|Исключение
|-
|SIGHUP
|1
|Завершение
|Закрытие терминала
|Уведомление
|-
|SIGILL
|4
|Завершение с дампом памяти
|Недопустимая инструкция процессора
|Исключение
|-
|SIGINT
|2
|Завершение
|Сигнал прерывания (Ctrl-C) с терминала
|Управление
|-
|SIGKILL
|9
|Завершение
|Безусловное завершение
|Управление
|-
|SIGPIPE
|13
|Завершение
|Запись в разорванное соединение (пайп, сокет)
|Уведомление
|-
|SIGQUIT
|3
|Завершение с дампом памяти
|Сигнал «Quit» с терминала (Ctrl-\)
|Управление
|-
|SIGSEGV
|11
|Завершение с дампом памяти
|Нарушение при обращении в память
|Исключение
|-
|SIGSTOP
|—
|Остановка процесса
|Остановка выполнения процесса
|Управление
|-
|SIGTERM
|15
|Завершение
|Сигнал завершения (сигнал по умолчанию для утилиты kill)
|Управление
|-
|SIGTSTP
|—
|Остановка процесса
|Сигнал остановки с терминала (Ctrl-Z).
|Управление
|-
|SIGTTIN
|—
|Остановка процесса
|Попытка чтения с терминала фоновым процессом
|Управление
|-
|SIGTTOU
|—
|Остановка процесса
|Попытка записи на терминал фоновым процессом
|Управление
|-
|SIGUSR1
|—
|Завершение
|Пользовательский сигнал № 1
|Пользовательский
|-
|SIGUSR2
|—
|Завершение
|Пользовательский сигнал № 2
|Пользовательский
|-
|SIGPOLL
|—
|Завершение
|Событие, отслеживаемое <code>poll()</code>
|Уведомление
|-
|SIGPROF
|—
|Завершение
|Истечение таймера профилирования
|Отладка
|-
|SIGSYS
|—
|Завершение с дампом памяти
|Неправильный системный вызов
|Исключение
|-
|SIGTRAP
|5
|Завершение с дампом памяти
|Ловушка трассировки или брейкпоинт
|Отладка
|-
|SIGURG
|—
|Игнорируется
|На сокете получены срочные данные
|Уведомление
|-
|SIGVTALRM
|—
|Завершение
|Истечение «виртуального таймера»
|Уведомление
|-
|SIGXCPU
|—
|Завершение с дампом памяти
|Процесс превысил лимит процессорного времени
|Исключение
|-
|SIGXFSZ
|—
|Завершение с дампом памяти
|Процесс превысил допустимый размер файла
|Исключение
|+
|}
Также есть сигналы, не определённые в POSIX, но присутствующие на некоторых операционных системах.
* SIGEMT
* [[SIGINFO&action=edit&redlink=1|SIGINFO]]. Посылается процессу, когда запрос статуса (info) получен от управляющего терминала.
* SIGPWR
* SIGLOST
* SIGWINCH
* SIGSTKFLT
* SIGUNUSED
* SIGCLD
При обработке исключений и отладочных сигналов перед завершением процесс может записать в текущий каталог файл с дампом памяти процесса (англ. core image), используя который, отладчик может восстановить условия, при которых возникло данное исключение. Иногда (например, для программ, выполняемых от имени суперпользователя) дамп памяти не создаётся из соображений безопасности.

Версия 22:41, 26 ноября 2024


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

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

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

Содержание

  • 1Посылка сигналов
  • 2Обработка сигналов
  • 3Безопасность
  • 4Классификация сигналов
  • 5SA_SIGINFO
  • 6Ссылки

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

[править | править код]

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

  • из терминала, нажатием специальных клавиш или комбинаций (например, нажатие 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 сигналов, которые можно классифицировать следующим образом:

Название Портируемый код Действие по умолчанию Описание Тип
SIGABRT 6 Завершение с дампом памяти Сигнал, посылаемый функцией abort() Управление
SIGALRM 14 Завершение Сигнал истечения времени, заданного alarm() Уведомление
SIGBUS — Завершение с дампом памяти Неправильное обращение в физическую память Исключение
SIGCHLD — Игнорируется Дочерний процесс завершен или остановлен Уведомление
SIGCONT — Продолжить выполнение Продолжить выполнение ранее остановленного процесса Управление
SIGFPE 8 Завершение с дампом памяти Ошибочная арифметическая операция Исключение
SIGHUP 1 Завершение Закрытие терминала Уведомление
SIGILL 4 Завершение с дампом памяти Недопустимая инструкция процессора Исключение
SIGINT 2 Завершение Сигнал прерывания (Ctrl-C) с терминала Управление
SIGKILL 9 Завершение Безусловное завершение Управление
SIGPIPE 13 Завершение Запись в разорванное соединение (пайп, сокет) Уведомление
SIGQUIT 3 Завершение с дампом памяти Сигнал «Quit» с терминала (Ctrl-\) Управление
SIGSEGV 11 Завершение с дампом памяти Нарушение при обращении в память Исключение
SIGSTOP — Остановка процесса Остановка выполнения процесса Управление
SIGTERM 15 Завершение Сигнал завершения (сигнал по умолчанию для утилиты kill) Управление
SIGTSTP — Остановка процесса Сигнал остановки с терминала (Ctrl-Z). Управление
SIGTTIN — Остановка процесса Попытка чтения с терминала фоновым процессом Управление
SIGTTOU — Остановка процесса Попытка записи на терминал фоновым процессом Управление
SIGUSR1 — Завершение Пользовательский сигнал № 1 Пользовательский
SIGUSR2 — Завершение Пользовательский сигнал № 2 Пользовательский
SIGPOLL — Завершение Событие, отслеживаемое poll() Уведомление
SIGPROF — Завершение Истечение таймера профилирования Отладка
SIGSYS — Завершение с дампом памяти Неправильный системный вызов Исключение
SIGTRAP 5 Завершение с дампом памяти Ловушка трассировки или брейкпоинт Отладка
SIGURG — Игнорируется На сокете получены срочные данные Уведомление
SIGVTALRM — Завершение Истечение «виртуального таймера» Уведомление
SIGXCPU — Завершение с дампом памяти Процесс превысил лимит процессорного времени Исключение
SIGXFSZ — Завершение с дампом памяти Процесс превысил допустимый размер файла Исключение

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

  • SIGEMT
  • SIGINFO. Посылается процессу, когда запрос статуса (info) получен от управляющего терминала.
  • SIGPWR
  • SIGLOST
  • SIGWINCH
  • SIGSTKFLT
  • SIGUNUSED
  • SIGCLD

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