Однако есть небольшой, по реальный риск, что входящий сигнал HUP поступит в тот опасный период, когда путем ветвления будет создан дочерний процесс, но еще не появится возможность переустановить обработчик $SIG{HUP}. Вот здесь также описано как поддержать безопасность вашего Windows XP. Самый безопасный порядок действий для родительского процесса состоит в том, чтобы временно заблокировать сигналы перед выполнением ветвления, а затем разблокировать их и в дочернем, и в родительском процессах после переустановки обработчиков сигналов дочернего процесса. Такую возможность предоставляет функция sigprocmask(), которая может быть получена из модуля POSIX.
Функция sigprocmask () манипулирует так называемой “маской сигнала” процесса — двоичной маской, которая управляет тем, какие сигналы будет (или не будет) получать процесс. По умолчанию процессы получают все сигналы операционной системы, но можно заблокировать лишь некоторые из них или все, установив новую маску сигнала. Сигналы не отбрасываются, а переводятся в состояние ожидания до тех пор, пока процесс не разблокирует сигналы.
Первым параметром функции sigprocmask ( ) является операция, которая должна быть выполнена с маской, а второй параметр задает набор сигналов, для которого должно быть выполнено указанное действие. Третий необязательный параметр получит копию старой маски процесса.
В качестве операции sigprocmask () может быть указана одна из следующих трех констант.
SIG_BLOCK. Сигналы, обозначенные в наборе сигналов, добавляются к маске сигнала процесса, что приводит к их блокированию.
SIG_UNBLOCK. Сигналы, обозначенные в наборе сигналов, удаляются из маски сигнала процесса, что приводит к их разблокированию.
SIG_SETMASK. Маска сигнала процесса полностью очищается и заменяется сигналами, указанными в наборе сигналов.