Сігналы (UNIX)

(Пасля перасылкі з Сігналы, 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 Завяршэнне Запіс у разарванае злучэнне (pipe, socket) Паведамленне
SIGQUIT Завяршэнне з дампам памяці Сігнал «Quit» з тэрмінала (Ctrl-\) Кіраванне
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, то ў апрацоўшчык будуць перададзены яшчэ два аргументы:

  1. указальнік на структуру siginfo_t, якая мае ў складзе:
    • бітавая маска дадатковых «кодаў сігналу», што вызначае прычыну яго ўзнікнення;
    • ідэнтыфікатар працэсу (PID), які даслаў сігнал;
    • эфектыўны ідэнтыфікатар карыстальніка (UID), ад імя якога выконваецца працэс (напрыклад, утыліта kill), якая даслала сігнал;
    • адрас інструкцыі, у якой узнікла выключэнне;
    • і г. д.
  2. указальнік на «машынны кантэкст» на момант узнікнення сігналу (са «стэкам сігналу» — дадатковымі данымі, якія змяшчаюцца ў стэк пры выкліку некаторых сігналаў-выключэнняў).

Большасць дадатковых кодаў спецыфічныя для кожнага сігналу. Коды, агульныя для ўсіх сігналаў:

Код Апісанне
SI_USER Сігнал дасланы функцыяй kill() (ці ўтылітай kill)
SI_QUEUE Сігнал дасланы функцыяй sigqueue()
SI_TIMER Сігнал дасланы па сканчэнні часу, вызначанага функцыяй timer_settime()
SI_ASYNCIO Сігнал дасланы па сканчэнні запыту на «асінхронны увод-вывад»
SI_MESGQ Сігнал дасланы па з’яўленні паведамлення ў пустой «чарзе паведамленняў Unix»

Гл. таксама правіць

Спасылкі правіць