Сігналы (UNIX)
Сігналы ў UNIX, Unix-падобных і іншых POSIX-сумяшчальных аперацыйных сістэмах з’яўляюцца адным з сродкаў узаемадзеяння паміж працэсамі (англ.: IPC, inter-process communication). Фактычна, сігнал — гэта асінхроннае паведамленне працэсу аб якой-небудзь падзеі. Калі сігнал дасланы працэсу, аперацыйная сістэма прыпыняе выконванне працэсу. Калі працэс усталяваў уласны апрацоўшчык сігналу, аперацыйная сістэма запускае гэты апрацоўшчык, перадаўшы яму інфармацыю аб сігнале. Калі працэс не ўсталяваў апрацоўшчык, то выконваецца апрацоўшчык па змоўчванню.
Назвы сігналаў «SIG…» з’яўляюцца лікавымі канстантамі (макравызначэннямі Сі) са значэннямі, якія вызначаюцца ў загалоўкавым файле signal.h
. Лікавыя значэнні сігналаў могуць адрознівацца ў розных сістэмах, хоць асноўная іх частка мае ў розных сістэмах адны і тыя ж значэнні. Утыліта kill
дазваляе задаваць сігнал як лічбай, так і сімвальным пазначэннем.
Пасылка сігналаў
[правіць | правіць зыходнік]Сігналы дасылаюцца:
- з тэрмінала, націсканнем спецыяльных клавіш ці іх камбінацый (напрыклад, націсканне Ctrl-C генеруе SIGINT, а Ctrl-Z SIGTSTP);
- ядром сістэмы:
- пры ўзнікненні апаратных выключэнняў (недапушчальных інструкцый, парушэннях пры звяртанні ў памяць, сістэмных збоях і г. д.);
- пры памылковых сістэмных выкліках;
- для інфармавання аб падзеях увода-вывада;
- адным працэсам другому (ці самому сабе), з дапамогай сістэмнага выкліку
kill()
, у тым ліку:- з каманднага радка, утылітай
/bin/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, то ў апрацоўшчык будуць перададзены яшчэ два аргументы:
- указальнік на структуру
siginfo_t
, якая мае ў складзе:- бітавая маска дадатковых «кодаў сігналу», што вызначае прычыну яго ўзнікнення;
- ідэнтыфікатар працэсу (PID), які даслаў сігнал;
- эфектыўны ідэнтыфікатар карыстальніка (UID), ад імя якога выконваецца працэс (напрыклад, утыліта
kill
), якая даслала сігнал; - адрас інструкцыі, у якой узнікла выключэнне;
- і г. д.
- указальнік на «машынны кантэкст» на момант узнікнення сігналу (са «стэкам сігналу» — дадатковымі данымі, якія змяшчаюцца ў стэк пры выкліку некаторых сігналаў-выключэнняў).
Большасць дадатковых кодаў спецыфічныя для кожнага сігналу. Коды, агульныя для ўсіх сігналаў:
Код | Апісанне |
---|---|
SI_USER | Сігнал дасланы функцыяй kill() (ці ўтылітай kill )
|
SI_QUEUE | Сігнал дасланы функцыяй sigqueue()
|
SI_TIMER | Сігнал дасланы па сканчэнні часу, вызначанага функцыяй timer_settime()
|
SI_ASYNCIO | Сігнал дасланы па сканчэнні запыту на «асінхронны увод-вывад» |
SI_MESGQ | Сігнал дасланы па з’яўленні паведамлення ў пустой «чарзе паведамленняў Unix» |
Гл. таксама
[правіць | правіць зыходнік]Спасылкі
[правіць | правіць зыходнік]- Signal Concepts (англ.) — Канцэпцыя сігналаў (IEEE Std 1003.1, 2004 Edition)
- signal.h (англ.) — Апісанне структур і канстантаў, звязаных з сігналамі (IEEE Std 1003.1, 2004 Edition)
- Правила использования сигналов в Unix (руск.) — «Правила игры в сигналы Unix» (Сообщение в конференции RU.UNIX.PROG)