- •Анотація
- •1 Середовище програмування ос unix
- •1.1 Структура ос unix
- •1.2 Створення програми
- •1. Препроцесор
- •2. Транслятор
- •2.1 Компілятор
- •2.2 Асемблер
- •3. Редактор зв'язків(Компонувальником)
- •1.3 Формати об'єктних файлів
- •2 Використання файлової системи unix
- •2.1 Основні поняття
- •2.1.1 Типи та іменування файлів
- •2.1.2 Права доступу до файлів
- •2.1.3 Cистемные структури керування файлами
- •2.1.4 Системні виклики роботи з файлами
- •2.2 Створення та відкриття файлів
- •2.2.1 Системний виклик open
- •2.2.2 Системний виклик create
- •2.2.3 Системний виклик close
- •2.3 Читання та зипис в файл
- •2.3.1 Системний виклик read
- •2.3.2 Системний виклик write
- •2.4 Позіціонування у файлі
- •2.4.1 Системний виклик lseek
- •2.4.2 Системні виклики pread і pwrite
- •2.4.3 Системні виклики readv і writev
- •2.5 Контрольні операції над файлами
- •2.5.1 Системні виклики stat, fstat і lstat
- •2.5.2 Контроль прав доступу до файлу
- •2.5.3 Функція fcntl
- •2.5.4 Системні виклики truncate і ftruncate
- •2.6 Управління каталогами
- •2.6.1 Створення і видалення
- •2.6.2 Читання каталога
- •2.6.3 Зміна каталога
- •2.7 Управління посиланнями
- •2.7.1 Управління жорсткими посиланнями
- •2.7.2 Управління символічними посиланнями
- •2.7.3 Перейменування файлів і каталогів
- •3 Керування процесами ос unix
- •3.1 Процеси ос unix
- •3.2 Сисвизови створення процесів
- •3.3 Завершення процесу
- •3.4 Взаємодія процесів в ос unix
- •3.5 Сигнали
- •3.5.1 Поняття сигналу
- •3.5.2 Розробка оброблювачів сигналів
- •3.5.3 Генерація сигналів
- •3.5.4 Посилка сигналів іншим процесам
- •3.5.5 Блокування сигналів
- •3.5.6 Очікування сигналу
- •3.6 Трасування процесу.
- •3.7 Канали й fifo-Файли
- •3.7.1 Поняття
- •3.7.2 Створення каналу
- •3.7.3 Створення fifo-Файлів
- •3.8 Семафори
- •3.9 Повідомлення.
- •3.10 Поділювана пам'ять.
- •Література
- •Системне програмування Навчальний посібник
- •65082, Одеса, вул. Дворянська, 1/3
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)) {
/* Спроба зупинити виконання процесу */
}