Наборы сигналов можно создавать и изучать с помощью небольшого вспомогательного класса POSIX::SigSet, который манипулирует наборами сигналов во многом алогично тому, как модуль IO::Select манипулирует наборами дескрипторов файлов. Для создания нового набора сигналов можно вызвать метод POSIX::SigSet->new () со списком констант сигналов. Эти константы носят имена SIGHUP, SIGTERM и т.д.
Теперь набор сигналов $signals можно передать функции sigprocmask (). Чтобы временно заблокировать сигналы INT, TERM и HUP, можно вызвать функцию sigprocmask () с параметром SIG_UNL0CK. Для разблокирования сигналов применяется параметр SIG_UNBLOCK. В случае успешного выполнения функция sigprocmask () возвращает истинное значение; в ином случае — ложное. Описание других операций установки сигналов, которые могут быть выполнены с помощью класса POSIX::SigSet, приведено в документе POD POSIX.
Рассмотрим новую версию модуля Daemon.
Строки 1-21. Установка модулей. Единственное изменение состоит в импорте нового набора функций POSIX, которые обозначены как группа :signal_h. Эти функции предоставляют функциональные средства временной блокировки сигналов, которые применяются в подпрограмме launch_child().
Строки 22-33. Подпрограмма init_server (). Эта подпрограмма идентична предыдущим версиям.
Строки 34-47. Подпрограмма become_daemon(). Эта подпрограмма идентична предыдущим версиям. Однако перед вызовом функции chdir ( ) для превращения текущего каталога в корневой, текущий каталог запоминается в глобальной переменной пакета $CWD. Это позволяет вернуться к такой же ситуации, какая была перед повторным запуском сервера.