В последней версии программы психотерапевтического сервера предусмотрено выполнение следующих действий. Сервер в ответ на сигнал HUP разрывает все текущие соединения, закрывает приемный сокет, а затем перезапускает сам себя. Изменен также обработчик TERM так, что сервер разрывает все соединения и прекращает свою работу. Перезапуск сервера таким образом приводит к тому, что сигнал HUP инициализирует корректный запуск. Запись в журнал приостанавливается и снова запускается, выполняется повторная инициализация памяти, а если есть файл конфигурации, он вновь его открывает и интерпретирует.
В этом примере не только показано, как обрабатывать сигнал HUP, но и проиллюстрированы два других метода.
1) Безопасное изменение обработчиков прерывания в дочернем процессе, созданном путем ветвления.
2) Вызов с помощью функции ехес () программы в условиях применения режима проверки потенциально опасных данных.
Для обеспечения правильной обработки сигнала HUP необходимо изменить и основной файл сценария, и модуль Daemon.
Изменения в основном сценарии
Подпрограмма launch_child () принимает два необязательных параметра: имя процедуры обратного вызова, которая должна быть вызвана после завершения работы дочернего процесса, и путь к каталогу, для которого должна быть выполнена функция chroot (). Первый параметр представляет собой ссылку на код. Этот код вызывается обработчиком chld модуля Daemon после вызова функции waitpid (), что позволяет включить в программу в случае необходимости дополнительный код. В данном примере это средство не требуется, поэтому первый параметр остается пустым. Однако в подпрограмме launch_child () должна быть выполнена функция chroot (), поэтому в качестве второго параметра задана константа eliza_home.