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

Сигнал — це засіб міжпроцесної взаємодії в 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» та ще декількох символів, що несуть в собі визначення функції сигналу. Кожна константа має відповідний їй числовий код; числові коди можуть відрізнятися в залежності від платформи.

СигналКодДія за умовчаннямОпис
SIGABRT6Д — Аварійно завершити процес з додатковими діямиСигнал переривання процесу
SIGALRM143 — Аварійно завершити процесСигнал, який посилається, коли спливає час, визначений alarm функцією
SIGBUS10ДНевірне звернення до фізичної пам'яті
SIGCHLD18І — Ігнорувати сигналДочірній процес перервано
SIGCONT25П — Продовжити перебіг процесуПродовжує виконання, якщо перед цим процес було зупинено.
SIGFPE8ДПомилкова арифметична операція.
SIGHUP13Термінал закрито.
SIGILL4ДНедопустима інструкція процесора.
SIGINT23Сигнал переривання із терміналу (Ctrl-C).
SIGKILL93Вбити процес (не може бути оброблено або проігноровано процесом).
SIGPIPE133Спроба записати в конвеєр за відсутності процесу приймача.
SIGQUIT3ДСигнал «Quit» з терміналу (Ctrl-\).
SIGSEGV11ДНевірне звернення до віртуальної пам'яті.
SIGSTOP23С — Зупинити процесЗупинити виконання (не може бути оброблено або проігноровано процесом).
SIGTERM153Сигнал завершення (встановлений за умовчанням для утиліти kill).
SIGTSTP20ССигнал зупинки, викликаний із терміналу (Ctrl-Z).
SIGTTIN26ССпроба зчитування з терміналу фоновим процесом.
SIGTTOU27ССпроба запису на термінал фоновим процесом.
SIGUSR1163Сигнал користувача 1.
SIGUSR2173Сигнал користувача 2.
SIGPOLL223Сигнал опитування процесу.
SIGPROF293Таймер профілювання сплинув.
SIGSYS12ДНеправильний системний виклик.
SIGTRAP5ДСигнал, викликаний точкою зупину або трасуванням.
SIGURG21ІТермінові дані, доступні на сокеті.
SIGVTALRM28ЗЧас на «віртуальному таймері» сплинув.
SIGXCPU30ДЛіміт процесорного часу перевищено.
SIGXFSZ31ДЛіміт розміру файлу перевищено.
Дії за умовчанням:
З — Аварійне завершення процесу. Процес завершується таким же чином, як і функцією _exit(), за виключенням того, що статус, доступний для wait() та waitpid(), показує що процес був завершений аварійно певним сигналом.
A — Аварійне завершення процесу. Додатково для цього сигналу можуть бути визначені дії, які виконуються в разі аварійного завершення, наприклад, вивантаження вмісту пам'яті (core dump).
І — Не зважати на сигнал.
С — Зупинити процес.
П — Продовжити перебіг процесу, якщо він був перед цим зупинений; в іншому випадку не зважати на сигнал.

Обробка сигналів

Обробники сигналів можуть призначатись функцією signal(). Якщо для певного сигналу не встановлений обробник, то використовується стандартний. В іншому випадку сигнал перехоплюється і викликається його обробник. Процес також може задавати два способи поведінки, без створення обробника: ігнорувати сигнал (SIG_IGN) та використати стандартний обробник (SIG_DFL). Є два сигнали, які не можуть бути перехопленими та обробленими: SIGKILL та SIGSTOP.


Див. також

Посилання

Виноски

  1. IEEE Std 1003.1, 2004 Edition. Процитовано 25 травня 2011.


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.