Сигнал (операційні системи)
Сигнал — це засіб міжпроцесної взаємодії в Unix-подібних та інших операційних системах, що сумісні зі стандартом POSIX. Сигнал являє собою асинхронне повідомлення, що посилається процесу, щоб проінформувати його про подію, яка відбулась. Коли процес отримує сигнал, операційна система перериває хід його виконання і запускає підпрограму обробки цього сигналу. Якщо в програмі явно не задана реакція на сигнал, запускається його стандартний обробник.
Відправлення сигналів
- Натискання певної комбінації клавіш в терміналі, в якому запущений процес, змушує систему відправляти певні сигнали (комбінації клавіш можна змінити командою stty):
- Ctrl-C (у деяких[уточнити] старих Unix-системах DEL) надсилає сигнал INT (SIGINT), за умовчанням це змушує процес завершитись.
- Ctrl-Z посилає сигнал TSTP (SIGTSTP); за умовчанням це змушує процес призупинити виконання.
- Ctrl-\ посилає сигнал QUIT (SIGQUIT); за умовчанням це змушує процес завершити роботу та зберегти дамп.
- Виклик системної функції kill(2) пошле заданий сигнал процесу, якщо дозволять права. Аналогічно команда шелла kill дозволить користувачу послати сигнал процесу. Спеціальна бібліотечна функція
raise(3)
посилає обраний сигнал поточному процесу. - Винятки, такі, як ділення на нуль чи порушення сегментації, теж генерують сигнали (тут SIGFPE та SIGSEGV відповідно, і обидва завершують роботу і зберігають дамп).
- Ядро може згенерувати сигнал, щоб повідомити процес про якусь подію. Наприклад, SIGPIPE генерується, коли процес пише у конвеєр, закритий процесом-читачем, за умовчанням це змушує процес завершити роботу.
Сигнали POSIX
Нижченаведений список документує перелік сигналів, які входять в специфікацію SUS.[1]. Усі сигнали визначені як константи у файлі <signal.h>
. Ім'я константи складається з префіксу «SIG» та ще декількох символів, що несуть в собі визначення функції сигналу. Кожна константа має відповідний їй числовий код; числові коди можуть відрізнятися в залежності від платформи.
Сигнал | Код | Дія за умовчанням | Опис |
---|---|---|---|
SIGABRT | 6 | Д — Аварійно завершити процес з додатковими діями | Сигнал переривання процесу |
SIGALRM | 14 | 3 — Аварійно завершити процес | Сигнал, який посилається, коли спливає час, визначений alarm функцією |
SIGBUS | 10 | Д | Невірне звернення до фізичної пам'яті |
SIGCHLD | 18 | І — Ігнорувати сигнал | Дочірній процес перервано |
SIGCONT | 25 | П — Продовжити перебіг процесу | Продовжує виконання, якщо перед цим процес було зупинено. |
SIGFPE | 8 | Д | Помилкова арифметична операція. |
SIGHUP | 1 | 3 | Термінал закрито. |
SIGILL | 4 | Д | Недопустима інструкція процесора. |
SIGINT | 2 | 3 | Сигнал переривання із терміналу (Ctrl-C). |
SIGKILL | 9 | 3 | Вбити процес (не може бути оброблено або проігноровано процесом). |
SIGPIPE | 13 | 3 | Спроба записати в конвеєр за відсутності процесу приймача. |
SIGQUIT | 3 | Д | Сигнал «Quit» з терміналу (Ctrl-\). |
SIGSEGV | 11 | Д | Невірне звернення до віртуальної пам'яті. |
SIGSTOP | 23 | С — Зупинити процес | Зупинити виконання (не може бути оброблено або проігноровано процесом). |
SIGTERM | 15 | 3 | Сигнал завершення (встановлений за умовчанням для утиліти kill). |
SIGTSTP | 20 | С | Сигнал зупинки, викликаний із терміналу (Ctrl-Z). |
SIGTTIN | 26 | С | Спроба зчитування з терміналу фоновим процесом. |
SIGTTOU | 27 | С | Спроба запису на термінал фоновим процесом. |
SIGUSR1 | 16 | 3 | Сигнал користувача 1. |
SIGUSR2 | 17 | 3 | Сигнал користувача 2. |
SIGPOLL | 22 | 3 | Сигнал опитування процесу. |
SIGPROF | 29 | 3 | Таймер профілювання сплинув. |
SIGSYS | 12 | Д | Неправильний системний виклик. |
SIGTRAP | 5 | Д | Сигнал, викликаний точкою зупину або трасуванням. |
SIGURG | 21 | І | Термінові дані, доступні на сокеті. |
SIGVTALRM | 28 | З | Час на «віртуальному таймері» сплинув. |
SIGXCPU | 30 | Д | Ліміт процесорного часу перевищено. |
SIGXFSZ | 31 | Д | Ліміт розміру файлу перевищено. |
- Дії за умовчанням:
- З — Аварійне завершення процесу. Процес завершується таким же чином, як і функцією _exit(), за виключенням того, що статус, доступний для wait() та waitpid(), показує що процес був завершений аварійно певним сигналом.
- A — Аварійне завершення процесу. Додатково для цього сигналу можуть бути визначені дії, які виконуються в разі аварійного завершення, наприклад, вивантаження вмісту пам'яті (core dump).
- І — Не зважати на сигнал.
- С — Зупинити процес.
- П — Продовжити перебіг процесу, якщо він був перед цим зупинений; в іншому випадку не зважати на сигнал.
Обробка сигналів
Обробники сигналів можуть призначатись функцією signal()
. Якщо для певного сигналу не встановлений обробник, то використовується стандартний. В іншому випадку сигнал перехоплюється і викликається його обробник. Процес також може задавати два способи поведінки, без створення обробника: ігнорувати сигнал (SIG_IGN) та використати стандартний обробник (SIG_DFL). Є два сигнали, які не можуть бути перехопленими та обробленими: SIGKILL та SIGSTOP.
Див. також
<signal.h>