Сігналы (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 сігналаў, якія можна класіфікаваць наступным чынам:

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

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

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

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

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

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