Сігналы (UNIX)

Сігналы ў UNIX, Unix-падобных і іншых POSIX-сумяшчальных аперацыйных сістэмах з’яўляюцца адным з сродкаў узаемадзеяння паміж працэсамі (). Фактычна, сігнал — гэта асінхроннае паведамленне працэсу аб якой-небудзь падзеі. Калі сігнал дасланы працэсу, аперацыйная сістэма прыпыняе выконванне працэсу. Калі працэс усталяваў уласны апрацоўшчык сігналу, аперацыйная сістэма запускае гэты апрацоўшчык, перадаўшы яму інфармацыю аб сігнале. Калі працэс не ўсталяваў апрацоўшчык, то выконваецца апрацоўшчык па змоўчванню.

Назвы сігналаў «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Завяршэнне з дампам памяціПрацэс перавысіў дапушчальны памер файлавыключная сітуацыя+

Пры апрацоўцы выключных сітуацый і адладкавых сігналаў перад завяршэннем працэс можа запісаць у бягучы каталог файл з дампам памяці працэсу (), з дапамогай якога, адладчык можа узнавіць умовы, пры якіх узнікла дадзеная выключная сітуацыя. Часам (напрыклад, для праграм, якія выконваюцца ад імя суперкарысальніка) дамп памяці не ствараецца з меркавання бяспекі.

 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»+

 Гл. таксама 
 kill
 killall

 Спасылкі 
 Signal Concepts — Канцэпцыя сігналаў (IEEE Std 1003.1, 2004 Edition)
 signal.h — Апісанне структур і канстантаў, звязаных з сігналамі (IEEE Std 1003.1, 2004 Edition)
 Правила использования сигналов в Unix — «Правила игры в сигналы Unix» (Сообщение в конференции RU.UNIX.PROG)

Катэгорыя:POSIX
Катэгорыя:Сігналы міжпрацэснага ўзаемадзеяння