Книга: Linux программирование в примерах
10.6.2. Наборы сигналов: sigset_t и связанные функции
10.6.2. Наборы сигналов: sigset_t
и связанные функции
Маска сигналов процесса является списком сигналов, которые процесс в настоящее время заблокировал. Сила POSIX API в том, что маской сигналов процесса можно манипулировать атомарно, как единым целым.
Маска сигналов процесса программно представляется с помощью набора сигналов. Это тип sigset_t
. Концептуально он представляет собой просто битовую маску, причем значения 0 и 1 представляют отсутствие или наличие определенного сигнала в маске.
/* Непосредственное манипулирование маской сигналов. НЕ ДЕЛАЙТЕ ЭТОГО! */
int mask = (1 << SIGHUP) | (1 << SIGINT);
/* битовая маска для SIGHUP и SIGINT */
Однако, поскольку в системе может быть больше сигналов, чем может содержаться в одной int
или long
и поскольку интенсивное использование побитовых операций тяжело для восприятия, для управления наборами сигналов существует несколько функций API.
#include <signal.h> /* POSIX */
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
Эти функции следующие:
int sigemptyset(sigset_t *set)
Освобождает набор сигналов. По возвращении *set
не содержит сигналов. Возвращает 0 в случае успеха и -1 при ошибке.
int sigfillset(sigset_t *set)
Полностью заполняет набор сигналов. По возвращении *set
содержит все сигналы, определенные системой. Возвращает 0 в случае успеха и -1 при ошибке.
int sigaddset(sigset_t *set, int signum)
Добавляет signum
к маске сигналов процесса в *set
. Возвращает 0 в случае успеха и -1 при ошибке.
int sigdelset(sigset_t *set, int signum)
Удаляет signum
из маски сигналов процесса в *set
. Возвращает 0 в случае успеха и -1 при ошибке.
int sigismember(const sigset_t *set, int signum)
Возвращает true/false, если signum
присутствует или не присутствует в *set
.
Перед выполнением с переменной sigset_t
каких-то действий всегда следует вызывать одну из функций sigemptyset()
или sigfillset()
. Существуют оба интерфейса, поскольку иногда бывает нужно начать с пустого набора и работать потом лишь с одним или двумя сигналами, а в другое время бывает нужно работать со всеми сигналами, возможно, убирая один или два сигнала.
- 10.6.1. Обнажение проблемы
- 10.6.2. Наборы сигналов: sigset_t и связанные функции
- 10.6.3. Управление маской сигналов: sigprocmask() и др.
- 10.6.4. Перехват сигналов: sigaction()
- 10.6.5. Извлечение ожидающих сигналов: sigpending()
- 10.6.6. Создание возможности для прерывания функций: siginterrupt()
- 10.6.7. Передача сигналов: kill() и killpg()
- 10.6.8. Наша история до настоящего времени, эпизод II
- 10.6.5. Извлечение ожидающих сигналов: sigpending()
- 10.6.6. Создание возможности для прерывания функций: siginterrupt()
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- 1.4 Структуры данных, связанные с драйверами устройств Windows
- Математические функции
- 7.4. Аналоговые перемножители сигналов
- 15.1.3. Обработка сигналов управления заданиями
- Риски, связанные с хостингом и потерей данных
- Размытые функции
- 7.3. Финансовые функции