Сигналы (UNIX)
Сигналы в UNIX, Unix-подобных и других POSIX-совместимых операционных системах являются одним из способов взаимодействия между процессами (англ. IPC, inter-process communication). Фактически, сигнал — это асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.
Названия сигналов «SIG…» являются числовыми константами (макроопределениями Си) со значениями, определяемыми в заголовочном файле signal.h
. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill
позволяет задавать сигнал как числом, так и символьным обозначением.
Посылка сигналов
Сигналы посылаются:
- с терминала, нажатием специальных клавиш или комбинаций (например, нажатие Ctrl-C генерирует SIGINT, а Ctrl-Z SIGTSTP);
- ядром системы:
- при возникновении аппаратных исключений (недопустимых инструкций, нарушениях при обращении в память, системных сбоях и т. п.);
- ошибочных системных вызовах;
- для информирования о событиях ввода-вывода;
- одним процессом другому (или самому себе), с помощью системного вызова
kill()
, в том числе:
Сигналы не могут быть посланы завершившемуся процессу, находящемуся в состоянии «зомби».
Обработка сигналов
Обработчик по умолчанию для большинства сигналов завершает выполнение процесса. Для альтернативной обработки всех сигналов, за исключением SIGKILL и SIGSTOP, процесс может назначить свой обработчик или игнорировать их возникновение модификацией своей сигнальной маски.
Безопасность
Процесс (или пользователь из шелла) с эффективным UID, не равным 0 (UID суперпользователя), может посылать сигналы только процессам с тем же UID.
Классификация сигналов
POSIX определяет 28 сигналов, которые можно классифицировать следующим образом:
Название | Действие по умолчанию | Описание | Тип |
---|---|---|---|
SIGABRT | Завершение с дампом памяти | Сигнал посылаемый функцией abort()
|
Управление |
SIGALRM | Завершение | Сигнал истечения времени заданного alarm()
|
Уведомление |
SIGBUS | Завершение с дампом памяти | Неправильное обращение в физическую память | Исключение |
SIGCHLD | Игнорируется | Дочерний процесс завершен или остановлен | Уведомление |
SIGCONT | Продолжить выполнение | Продолжить выполнение ранее остановленного процесса | Управление |
SIGFPE | Завершение с дампом памяти | Ошибочная арифметическая операция | Исключение |
SIGHUP | Завершение | Закрытие терминала | Уведомление |
SIGILL | Завершение с дампом памяти | Недопустимая инструкция процессора | Исключение |
SIGINT | Завершение | Сигнал прерывания (Ctrl-C) с терминала | Управление |
SIGKILL | завершение | Безусловное завершение | управление |
SIGPIPE | Завершение | Запись в разорванное соедиение (пайп, сокет) | Уведомление |
SIGQUIT | Завершение с дампом памяти | Сигнал «Quit» с терминала | Управление |
SIGSEGV | Завершение с дампом памяти | Нарушение при обращении в память | Исключение |
SIGSTOP | остановка процесса | Остановка выполнения процесса | управление |
SIGTERM | Завершение | Сигнал завершения (сигнал по умолчанию для утилиты kill) | Управление |
SIGTSTP | Остановка процесса | Сигнал остановки с терминала (Ctrl-Z). | Управление |
SIGTTIN | Остановка процесса | Попытка чтения с терминала фоновым процессом | Управление |
SIGTTOU | Остановка процесса | Попытка записи на терминал фоновым процессом | Управление |
SIGUSR1 | Завершение | Пользовательский сигнал № 1 | Пользовательский |
SIGUSR2 | Завершение | Пользовательский сигнал № 2 | Пользовательский |
SIGPOLL | Завершение | Событие отслеживаемое poll()
|
Уведомление |
SIGPROF | Завершение | Истечение таймера профилирования | Отладка |
SIGSYS | Завершение с дампом памяти | Неправильный системный вызов | Исключение |
SIGTRAP | Завершение с дампом памяти | Ловушка трассировки или брейкпоинт | Отладка |
SIGURG | Игнорируется | На сокете получены срочные данные | Уведомление |
SIGVTALRM | Завершение | Истечение «виртуального таймера» | Уведомление |
SIGXCPU | Завершение с дампом памяти | Процесс превысил лимит процессорного времени | Исключение |
SIGXFSZ | Завершение с дампом памяти | Процесс превысил допустимый размер файла | Исключение |
При обработке исключений и отладочных сигналов перед завершением процесс может записать в текущий каталог файл с дампом памяти процесса (англ. core image), используя который, отладчик может восстановить условия, при которых возникло данное исключение. Иногда (например, для программ, выполняемых от имени суперпользователя) дампа памяти не создаётся из соображений безопасности.
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)
- sighal.h(англ.) — Описание структур и констант, связанных с сигналами (IEEE Std 1003.1, 2004 Edition)
- Правила использования сигналов в Unix(рус.) — «Правила игры в сигналы Unix» (Сообщение в конференции RU.UNIX.PROG)
root@mybox:~# | Это незавершённая статья о системах класса UNIX. Вы можете помочь проекту, исправив и дополнив её. |
Межпроцессное взаимодействие в информатике |
|
---|---|
Методы | Файл · Memory-mapped file · Обмен сообщениями · Message queue and mailbox · Именованный канал · Anonymous pipe · Pipe · Семафор · Shared memory · Сигнал · Сокет · Unix domain socket |
Избранные протоколы и стандарты |
Apple events · CORBA · D-Bus · DCE · DCOP · DIPC · ICE · LINX · ONC RPC · POSIX (различные методы) · SOAP · Thrift · TIPC · XML-RPC · COM+ |
ca:Senyal (informàtica) cs:Signál (informatika) de:Signal (Computer) en:Signal (computing) es:Señal (informática) it:Segnale (informatica) ja:シグナル (ソフトウェア) mk:Сигнал (компјутерска технологија) pt:Sinal (ciência da computação) sv:Signal (datavetenskap) zh:信号 (计算机科学)
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....