Книга: Linux программирование в примерах
10.6.3. Управление маской сигналов: sigprocmask() и др.
10.6.3. Управление маской сигналов: sigprocmask()
и др.
Маска сигналов процесса вначале пуста - заблокированных сигналов нет. (Это упрощение; см. раздел 10.9 «Сигналы, передающиеся через fork()
и exec()
.) Три функции позволяют работать непосредственно с маской сигналов процесса:
#include <signal.h> /* POSIX */
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *set);
Функции следующие:
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)
Если oldset
не равен NULL
, получается маска сигналов текущего процесса и помещается в *oldset
. Затем маска сигналов процесса обновляется в соответствии с содержимым set
и значением how
, который должен иметь одно из следующих значений:
SIG_BLOCK
Объединить сигналы в *set
с маской сигналов текущего процесса. Новая маска является объединением текущей маски и *set
.
SIG_UNBLOCK
Удалить сигналы в *set
из маски сигналов процесса. Это не представляет проблемы, если *set
содержит сигнал, который не содержится в текущей маске сигналов процесса.
SIG_SETMASK
Заменить маску сигналов процесса содержимым *set
.
Если set
равен NULL
, a oldset
— нет, значение how
неважно. Эта комбинация получает маску сигналов текущего процесса, не меняя ее. (Это явно выражено в стандарте POSIX, но не ясно из справочной страницы GNU/Linux.)
int sigpending(sigset_t *set)
Эта функция позволяет увидеть, какие сигналы ожидают решения; т.е. *set
заполнен этими сигналами, которые были посланы, но они еще не доставлены, поскольку заблокированы.
int sigsuspend(const sigset_t *set)
Эта функция временно заменяет маску сигналов процесса содержимым *set
, а затем приостанавливает процесс, пока сигнал не будет получен. По определению, заставить функцию вернуться может только сигнал, не находящийся в *set
(см. раздел 10.7 «Сигналы для межпроцессного взаимодействия).
- 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.4. Обработчики сигналов в действии
- Снижение требований к точности входных сигналов
- 12.1. Концепция сигналов
- УПРАВЛЕНИЕ РЕПУТАЦИЕЙ В ИНТЕРНЕТЕ
- Глава 7 Управление хранилищем данных
- Глава 11 Корпоративное управление и стратегия
- 5.7 Устройства NAS под управлением Windows и моментальные снимки
- 7.4. Аналоговые перемножители сигналов
- 7.8 Управление иерархическим хранилищем
- 15.1.3. Обработка сигналов управления заданиями
- Управление файлами занятий
- Управление пользователями и разрешениями узла