Книга: Linux программирование в примерах
10.6.8. Наша история до настоящего времени, эпизод II
10.6.8. Наша история до настоящего времени, эпизод II
System V Release 3 API был предназначен для исправления различных проблем, представленных первоначальным API сигналов V7. В частности, важной дополнительной концепцией является понятие о блокировке сигналов.
Однако, этот API оказался недостаточным, поскольку он работал лишь с одним сигналом за раз, оставляя множество широко открытых окон, через которые могли поступать нежелательные сигналы. POSIX API, работая атомарно с множеством сигналов (маской сигналов процесса, программно представленной типом sigset_t
), решает эту проблему, закрывая окна.
Первый набор функций, который мы исследовали, манипулирует значениями sigset_t
: sigfillset()
, sigemptyset()
, sigaddset()
, sigdelset()
и sigismember()
.
Следующий набор работает с маской сигналов процесса: sigprocmask()
устанавливает и получает маску сигналов процесса, sigpending()
получает набор ожидающих сигналов, a sigsuspend()
помещает процесс в состояние сна, временно заменяя маску сигналов процесса одним из своих параметров.
Функция POSIX API sigaction()
(весьма) запутана из-за необходимости обеспечить:
• обратную совместимость: SA_RESETHAND
и SA_RESTART
в поле sa_flags
;
• выбор, блокировать также полученный сигнал или нет: SA_NODEFER
для sa_flags
;
• возможность иметь два различных вида обработчиков сигналов: с одним или с тремя аргументами;
• выбор поведения для управления SIGCHLD
: SA_NOCLDSTOP
и SA_NOCLDWAIT
для sa_flags
.
Функция siginterrupt()
является удобной для разрешения или запрещения повторного запуска системных вызовов для данного сигнала.
Наконец, для посылки сигналов не только текущему, но также и другим процессам могут использоваться kill()
и killpg()
(конечно, с проверкой прав доступа).
- 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.7. Наша история до настоящего времени, эпизод 1
- Глава 13 Как вычислить настоящего SEO-профессионала
- Как «вычислить» настоящего СЕО профессионала
- Наша приятная бесцельная жизнь
- Взгляд из настоящего
- Часть I. История систем
- Уменьшение времени, необходимого для резервного копирования и восстановления
- Ограничение времени ожидания для транзакций (Lock timeout)
- 7.12. Объективизация времени
- Квант времени
- Формула времени. Тайм-менеджмент на Outlook 2013
- История развития компьютеров (вместо пролога)