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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Сигнал це засіб міжпроцесної взаємодії в Unix-подібних, та інших операційних системах що сумісні зі стандартом POSIX. Сигнал являє собою асинхронне повідомлення що посилається процесу щоб проінформувати його про подію яка відбулась. Коли процес отримує сигнал, операційна система перериває хід його виконання, і запускає підпрограму обробки цього сигналу. Якщо в програмі явно не задана реакція на сигнал, запускається його стандартний обробник.

Відправлення сигналів[ред.ред. код]

  • Натискання певної комбінації клавіш в терміналі в якому запущений процес, змушує систему відправляти певні сигнали:
    • Ctrl-C (в старих Юніксах, DEL) посилає сигнал INT (SIGINT), за замовчуванням це змушує процес завершитись.
    • Ctrl-Z посилає сигнал TSTP (SIGTSTP); за замовчуванням це змушує процес призупинити виконання.
    • Ctrl-\ посилає сигнал QUIT (SIGQUIT); за замовчуванням, це змушує процес завершити роботу, та зберегти дамп.
    • (Стандартні комбінації клавіш можна змінити командою stty.)
  • Виклик системної функції 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 May 2011.