Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PR_СП_лекции_укр.doc
Скачиваний:
6
Добавлен:
22.04.2019
Размер:
697.34 Кб
Скачать

3.5.3 Генерація сигналів

Процес може послати сигнал самому собі з використанням наступної функції.

int raise(int SIGNUM)

Функція посилає сигнал зухвалому процесу. Повертає 0 у випадку успіху й ненульове значення в противному випадку. Єдиною можливістю одержання несприятливого результату є невірне значення SIGNUM. Зокрема, raise може використовуватися для виконання дій, запропонованих сигналу за замовчуванням.

3.5.4 Посилка сигналів іншим процесам

Для посилки сигнали іншим процесам може використовуватися функція kill. Вона може використовуватися для виконання безлічі різних дій.

Необхідність посилати сигнали іншим процесам виникає, наприклад, у наступних випадках:

  • батьківський процес запускає породжений для виконання деякого завдання, причому виконуючий невизначений цикл, і завершує його, коли надалі виконанні завдання немає необхідності;

  • процес виконується як один із процесів у групі й має потребу в перериванні або інформуванні інших процесів при виникненні помилки або якої-небудь критичної події;

  • два процеси необхідно синхронізувати при одночасному виконанні.

int kill(pid_t PID, int SIGNUM)

Функція kill посилає сигнал SIGNUM процесу або групі процесів, що задається PID. PID може приймати наступні значення:

  1. 0 сигнал посилає процесу, ідентифікатор якого дорівнює PID;

  2. == 0 сигнал посилає всім процесам, які перебувають у тій же групі процесів, що й процес-відправник;

  3. < -1 сигнал посилає групі процесів, ідентифікатор якої дорівнює PID;

  4. == -1 якщо процес є привілейованим, то сигнал посилає всім процесам, крім деяких системних процесів. Інакше, сигнал посилає всім процесам, власником яких є поточний користувач.

Якщо сигнал успішно посланий, то kill повертає 0, інакше сигнал не посилає й функція повертає -1. У випадку невдачі в змінної errno вертаються наступні коди:

EINVAL аргумент SIGNUM містить неправильний номер сигналу;

EPERM відсутні привілею на посилку сигналу процесу або групі процесів;

ESCRH аргумент PID не відповідає жодному з існуючих процесів або груп процесів.

Процес може послати сигнал самому собі за допомогою виклику kill(getpid(), SIG), що рівнозначно raise(SIG).

Системний виклик kill() посилає сигнал SIGKILL (код 09) до процесу з тим же ефективним користувальницьким ідентифікатором (при цьому необхідно врахувати, що вбити процес може тільки його власник або суперкористувач).

Сигнали SIGINT і SIGQUIT посилають між процесами, що розділяють один термінал.

SIGCLD (18), що відзначає смерть процесу-дитини, посилає процесу-батькові, що має по визначенню той же ефективний ідентифікатор користувача.

SIGSYS(12) - сигнал системної помилки, і SIGTRAP(05) - сигнал трасування при наявності помилки, посилають процесом самому собі.

Коли процес установлює сигнал, він модернізує відповідне поле в таблиці процесу й цим полем є p_sig, де кожний біт показує статус сигналу для процесу. Т.к. для кожного сигналу приділяється єдиний біт, то сигнали не можуть бути поставлені в чергу; цей біт зводиться при посилці сигналу. Якщо сигнал не був оброблений до посилки наступного сигналу, то установка біта зберігається, але кількість посланих сигналів не відзначається, тому що місця для цього не виділено. Цей біт може зняти лише обробка, час установки сигналу не враховується. Керування сигналом можливо тільки коли процес працює або до нього буде передане керування після виклику.

Хоча ранг сигналів, що посилаються, і обмежений, дії, що вживаються після одержання сигналу, можуть варіюватися. У пам'яті користувача для процесу є таблиця u_signal c двадцятьма входами (по числу сигналів, які можуть бути отримані). При одержанні кожного із сигналів можливе виконання однієї з наступних дій:

  • неявна дія (SIG_DEL), що має величину 0 і показує, що процес повинен закінчитися;

  • дія, що ігнорує (SIG_IGN), характеризуемое деяким більшим числом і що показує, що сигнал варто ігнорувати;

  • деяке не нульове значення, що задає адреса функції, яку необхідно виконати з появою сигналу.

Відзначимо, що сигнал "kill" здатний убити інший процес.

Системний виклик signal() дозволяє змінювати входи в таблиці u_signal.

Для керуваннями сигналами використовуються дві внутрішні функції:

  • insig() - перевіряє існування якого-небудь сигналу, що не ігнорує дії, передбачені для процесу.

  • psig() - виконує дії, пов'язані з найнижчим із установлених сигналів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]