Сигнали

Сигнал являє собою повідомлення процесу про деяке подію, що посилається системою або іншим процесом.

Основними характеристиками сигналу є його номер і адресат сигналу. У різних версіях UNIX використовується від 16 до 32 сигналів. Номер сигналу означає причину його посилки. У програмах номер сигналу зазвичай задається однією з стандартних констант. Відзначимо наступні сигнали:

· SIGKILL - процес повинен бути негайно припинений;

· SIGTERM - більш «ввічлива» форма: система пропонує процесу припинитися, але він може і не послухатися;

· SIGILL - процес виконав неприпустиму команду;

· SIGSEGV - процес звернувся до невірного адресою пам'яті;

· SIGHUP - розірваний зв'язок процесу з керуючим терміналом (наприклад, модем «повісив трубку»);

· SIGPIPE - процес спробував записати дані в канал, до іншого кінця якої не приєднаний жоден процес;

· SIGSTOP - процес повинен бути негайно припинений;

· SIGCONT - призупинений процес відновлює роботу;

· SIGINT - користувач натиснув Ctrl + C, щоб перервати процес;

· SIGALRM - надійшов сигнал від раніше запущеного таймера;

· SIGCHLD - завершився один з нащадків процесу;

· SIGPWR - виникла загроза втрати електроживлення, комп'ютер переключився на автономне джерело (тобто пора терміново рятувати дані);

· SIGUSR1, SIGUSR2 - номери сигналів, надані в розпорядження прикладних програм для використання в довільних цілях.

При виникненні відповідного події система посилає сигнал процесу або групі процесів (наприклад, SIGHUP надсилається всім процесам, пов'язаним з даним терміналом).

Будь-який процес також може послати будь-який сигнал іншому процесу або групі процесів. Для цього використовується системний виклик зі страшним ім'ям kill. Параметрами функції служать номер посилається сигналу і одержувач сигналу. Сигнал може бути посланий конкретному процесу (вказується pid одержувача), а також всім процесам групи відправника або інший вказаної групи, або всім процесам, запущеним даними користувачем. Платний користувач може навіть послати сигнал всім процесам в системі, за винятком кореневих системних процесів 0 і 1.

Для кожного процесу система зберігає маску, задаючу його реакцію на кожний з сигналів. Всього можливо три види реакції.

· За замовчуванням - виконуються дії, передбачені системою для даного номера сигналу. Для більшості сигналів дії за замовчуванням передбачають завершення процесу.

· Ігнорувати - процес ніяк не реагує на одержання сигналу.

· Обробити - в цьому випадку процес повинен задати адресу функції, яка буде викликана при отриманні сигналу.

Для сигналів SIGKILL і SIGSTOP завжди використовується реакція за замовчуванням. Для решти сигналів процес може встановити необхідну реакцію. Традиційним засобом для цього є системний виклик signal. Одним з параметрів цієї функції вказується номер сигналу, іншим - або адресу функції, обробної сигнал, або одне зі спеціальних значень, що означають «За замовчуванням» і «Ігнорувати».

Установка функції-обробника для сигналу діє тільки на перший отриманий сигнал з даним номером, відразу ж при виклику цієї функції система автоматично відновлює обробку за замовчуванням. Ймовірно, це було зроблено для того, щоб уникнути повторного виклику обробника, якщо наступний сигнал буде отриманий до завершення обробки першого. Однак в результаті може трапитися інша неприємність: якщо процес не встигне знову встановити обробник сигналу, то при отриманні наступного сигналу процес може бути припинений у порядку обробки сигналу за замовчуванням.

 

Ще один недолік традиційної моделі обробки сигналів є неможливість тимчасово заблокувати обробку сигналів на період виконання будь-яких критично важливих дій. Доводиться вибирати: або сигнал повинен бути оброблений негайно при отриманні, або він буде проігнорований і втрачений.

У сучасних версіях UNIX, поряд з традиційними засобами обробки сигналів, може також використовуватися апарат «надійних сигналів», що дозволяє подолати названі труднощі.