Книга: Linux программирование в примерах
12.5.2. Обработка масок сигналов: sigsetjmp() и siglongjmp()
12.5.2. Обработка масок сигналов: sigsetjmp()
и siglongjmp()
По историческим причинам, которые, скорее всего, утомили бы вас до слез, стандарт С 1999 г. ничего не говорит о влиянии setjmp()
и longjmp()
на состояние сигналов процесса, а POSIX явно констатирует, что их влияние на маску сигналов процесса (см. раздел 10.6 «Сигналы POSIX») не определено.
Другими словами, если программа изменяет свою маску сигналов процесса между первым вызовом setjmp()
и вызовом longjmp()
, каково состояние маски сигналов процесса после longjmp()
? Та ли эта маска, когда была впервые вызвана setjmp()
? Или это текущая маска? POSIX явно утверждает, что «нет способа это узнать».
Чтобы сделать обработку маски сигналов процесса явной, POSIX ввел две дополнительные функции и один typedef
:
#include <setjmp.h> /* POSIX */
int sigsetjmp(sigjmp_buf env, int savesigs); /* Обратите внимание:
sigjmp_buf, не jmp_buf! */
void siglongjmp(sigjmp_buf env, int val);
Главным отличием является аргумент savesigs
функции sigsetjmp()
. Если он не равен нулю, текущий набор заблокированных сигналов сохраняется в env
вместе с остальным окружением, которое сохраняется функцией setjmp()
. siglongjmp()
с env
, в которой savesigs
содержала true, восстанавливает сохраненную маску сигналов процесса
ЗАМЕЧАНИЕ. POSIX также ясен в том, что если savesigs
равен нулю (false), сохраняется ли маска сигналов процесса или восстанавливается, не определено, как в случае с setjmp()
/longjmp()
. Это, в свою очередь, предполагает, что если собираетесь использовать 'sigsetjmp(env, 0)
', вы также можете не беспокоиться: все дело в том, чтобы иметь контроль над сохранением и восстановлением маски сигналов процесса!
- Глава 12 Обработка сигналов
- Обработка перехваченных ошибок
- 5.4 Команда trap: обработка прерываний
- 15.3. Обработка изображений при помощи RMagick
- 7.4. Аналоговые перемножители сигналов
- 15.1.3. Обработка сигналов управления заданиями
- ГЛАВА 4 Обработка исключений
- Обработка запросов с помощью PHP
- ГЛАВА 6. Структурированная обработка исключений
- Обработка ошибок
- Скрипт «Обработка входящего звонка от потенциального клиента»
- Обработка данных на промежуточном уровне