Введение

Сигнал Unix
На платформах, соответствующих стандарту POSIX, SIGHUP ("сигнал обрыва соединения") — это сигнал, отправляемый процессу при закрытии управляющего терминала. Изначально он был разработан для уведомления процесса о разрыве соединения с последовательной линией. SIGHUP — символическая константа, определенная в заголовочном файле signal.h.

История

Доступ к компьютерным системам на протяжении многих лет осуществлялся путем подключения терминала к мэйнфрейму через последовательную линию с использованием протокола RS 232. При разработке системы программных прерываний, известных как сигналы, один из этих сигналов был выделен для обработки обрыва соединения. Сигнал SIGHUP отправлялся программам при разрыве последовательной линии, часто из-за того, что пользователь разорвал соединение, отключив модем. Система определяла разрыв соединения по отсутствию сигнала обнаружения несущей (DCD). Сигналы всегда были удобным способом межпроцессного взаимодействия (IPC), но в ранних реализациях не было определяемых пользователем сигналов (таких как последующие SIGUSR1 и SIGUSR2), которые программы могли бы перехватывать и интерпретировать для собственных нужд. Поэтому приложения, не требующие управляющего терминала, такие как демоны, стали использовать SIGHUP для повторного чтения файлов конфигурации или переинициализации. Эта практика сохранилась и по сей день в таких пакетах, как Apache и Sendmail.

Современное использование

С уменьшением использования последовательного порта значение сигнала SIGHUP несколько изменилось в современных системах, часто означая, что был закрыт управляющий псевдо- или виртуальный терминал. Если команда выполняется в окне терминала и это окно закрывается, пока процесс команды еще работает, он получает сигнал SIGHUP. Если процесс, получивший SIGHUP, является оболочкой Unix, то в рамках управления заданиями он часто перехватывает этот сигнал и обеспечивает продолжение всех остановленных процессов перед отправкой сигнала дочерним процессам (точнее, группам процессов, которые оболочка представляет как "задания"), что по умолчанию приводит к их завершению. Это можно обойти двумя способами. Во-первых, спецификация Single UNIX описывает утилиту оболочки nohup, которую можно использовать для запуска программы и заставить её игнорировать SIGHUP по умолчанию. Во-вторых, группы дочерних процессов можно "отвязать" с помощью команды disown с указанием идентификатора задания, что удаляет группу процессов из таблицы заданий оболочки (в результате чего они не будут получать SIGHUP), или (опционально) сохраняет их в таблице заданий, но предотвращает получение ими SIGHUP при завершении оболочки. Различные оболочки также предоставляют другие способы управления SIGHUP, например, функцию disown в ksh. В документации большинства современных дистрибутивов Linux указано, что для отправки сигнала SIGHUP используется команда kill HUP <processID>. Программы-демоны иногда используют SIGHUP как сигнал для перезапуска, наиболее частой причиной чего является повторное чтение измененного конфигурационного файла.

Подробности

Символические имена сигналов используются, поскольку номера сигналов могут различаться на разных платформах, но системы, соответствующие стандарту XSI, допускают использование числовой константы 1 для обозначения сигнала SIGHUP, что и делают в подавляющем большинстве систем. Сигнал SIGHUP может быть обработан. То есть программисты могут определить действие, которое должно выполняться при получении сигнала SIGHUP, например, вызов функции, игнорирование сигнала или восстановление действия по умолчанию. Действие по умолчанию в системах, соответствующих стандарту POSIX, – ненормальное завершение программы.