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

3.5.5 Блокування сигналів

Блокування сигналів може бути корисно в наступних випадках:

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

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

  • єдиний спосіб перевірки появи сигналу - його блокування.

Всі функції блокування сигналів використовують структуру даних sigset_t, називану “набором сигналів”, для вказівки які сигнали будуть заблоковані.

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

int sigemptyset(sigset_t *SET)

Функція виключає з безлічі заблокованих всі певні сигнали. Завжди повертає 0.

int sigfullset(sigset_t *SET)

Функція включає в безліч заблокованих всі певні сигнали. Завжди повертає 0.

int sigaddset(sigset_t *SET, int SIGNUM)

Функція додає сигнал SIGNUM у набір сигналів SET. Повертає 0 у випадку успішного виконання й -1 у випадку помилки. При виникненні помилки змінна errno може приймати наступне значення:

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

int sigdelset(sigset_t *SET)

Функція видаляє сигнал SIGNUM з набору сигналів SET. Значення, що повертаються, такі ж, як і для функції sigaddset.

int sigismember(const sigset_t *SET, int SIGNUM)

Функція перевіряє чи входить сигнал SIGNUM у набір сигналів SET.

Повертає 1, якщо сигнал перебуває в наборі й 0 у противному випадку, -1 - у випадку помилки виконання. При виникненні помилки змінна errno може приймати наступне значення:

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

Набір сигналів, що заблокований у цей момент, називається “маскою сигналів”. Кожний процес має свою власну маску сигналів. При створенні нового процесу, він успадковує маску сигналів батьківського процесу. Для модифікації маски сигналів використовується наступна функція:

int sigprocmask(int HOW, const sigset_t *SET, sigset_t *OLDSET)

Аргумент HOW визначає яким образом змінюється маска сигналів і може приймати наступні значення:

SIG_BLOCK сигнали, що задаються в наборі, блокуються - додаються до вже існуючої маски сигналів;

SIG_UNBLOCK сигнали, що задаються в наборі, розблокуються - віддаляються із уже існуючої маски сигналів процесу;

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

Аргумент OLDSET використовується для повернення старого вмісту маски сигналів процесу.

Функція повертає 0 у випадку успіху й -1 у противному випадку. При виникненні помилки змінна errno може приймати наступне значення:

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

Для перевірки того, оброблювачі яких сигналів активні в даний момент використовується наступна функція:

int sigpending(sigset_t *SET)

Функція повертає інформацію про активні в сучасний момент сигналах. Якщо є заблокований сигнал, що надійшов процесу, то він також включається в маску сигналів. Повертає 0 у випадку успішного виконання й -1 у випадку помилки.

Приклад перевірки активних сигналів:

#include <signal.h>

#include <stddef.h>

sigset_t base_mask, waiting_mask;

sigemptyset (&base_mask);

sigaddset (&base_mask, SIGINT);

sigaddset (&base_mask, SIGTSTP);

/* Блокування переривань користувача */

sigprocmask (SIG_SETMASK, &base_mask, NULL);

...

sigpending (&waiting_mask);

if (sigismember (&waiting_mask, SIGINT)) {

/* Спроба припинити виконання процесу */

}

else if (sigismember (&waiting_mask, SIGTSTP)) {

/* Спроба зупинити виконання процесу */

}

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