Перейти до вмісту

Сигнал (операційні системи)

Матеріал з Вікіпедії — вільної енциклопедії.

Сигнал — це засіб міжпроцесної взаємодії в 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.


Див. також

[ред. | ред. код]

Посилання

[ред. | ред. код]

Виноски

[ред. | ред. код]
  1. IEEE Std 1003.1, 2004 Edition. Процитовано 25 травня 2011.