На платформах, совместимых с POSIX , SIGHUP (« sig nal h ang up ») - это сигнал, отправляемый процессу, когда его управляющий терминал закрыт. (Первоначально он был разработан для уведомления процесса обрыва последовательной линии .) SIGHUP - это символическая константа, определенная в файле заголовка signal.h
.
История
Доступ к компьютерным системам на протяжении многих лет заключался в подключении терминала к системе мэйнфрейма через последовательную линию и протокол RS-232 . По этой причине, когда разрабатывалась система программных прерываний , называемых сигналами, сигнал был предназначен для использования на «зависании».
SIGHUP отправлялся программам при отключении последовательной линии, часто из-за того, что подключенный пользователь разорвал соединение, повесив модем. Система обнаружит, что линия была отключена с помощью сигнала обнаружения потери несущей данных (DCD).
Сигналы всегда были удобным методом межпроцессного взаимодействия (IPC), но в ранних реализациях не было определяемых пользователем сигналов (таких как более поздние добавления SIGUSR1 и SIGUSR2 ), которые программы могли бы перехватывать и интерпретировать для своих собственных целей. По этой причине приложения, которым не требовался управляющий терминал, такие как демоны , будут повторно использовать SIGHUP как сигнал для повторного чтения файлов конфигурации или повторной инициализации. Это соглашение сохранилось и по сей день в таких пакетах, как Apache и Sendmail .
Современное использование
С уменьшением доступа через последовательную линию значение SIGHUP несколько изменилось в современных системах, часто это означает, что управляющий псевдо или виртуальный терминал был закрыт. Если команда выполняется в окне терминала и окно терминала закрывается, пока процесс команды все еще выполняется, он получает сигнал SIGHUP. [1]
Если процесс, получающий SIGHUP, является оболочкой Unix , то в рамках управления заданиями он часто перехватывает сигнал и гарантирует, что все остановленные процессы продолжаются перед отправкой сигнала дочерним процессам (точнее, группам процессов , представленных внутри оболочкой как «задание»), который по умолчанию их завершает. [2]
Этого можно избежать двумя способами. Во-первых, спецификация Single UNIX описывает служебную программу оболочки nohup , которую можно использовать в качестве оболочки для запуска программы и по умолчанию игнорировать сигнал SIGHUP. Во-вторых, дочерние группы процессов могут быть "отклонены" путем вызова disown с идентификатором задания , который удаляет группу процессов из таблицы заданий оболочки (чтобы они не отправлялись SIGHUP) или (необязательно) сохраняет их в таблице заданий, но предотвращает им от получения SIGHUP при завершении работы оболочки.
В разных оболочках есть и другие методы контроля и управления SIGHUP, такие как функция disown для ksh . В документации большинства современных дистрибутивов Linux указано использование kill -HUP
для отправки сигнала SIGHUP. [3]
Программы- демоны иногда используют сигнал SIGHUP как сигнал для перезапуска, наиболее частой причиной этого является повторное чтение файла конфигурации, который был изменен.
Подробности
Символические имена сигналов используются, потому что номера сигналов могут различаться на разных платформах, но XSI- совместимые системы позволяют использовать числовую константу 1 для обозначения SIGHUP, который фактически используется подавляющим большинством систем.
SIGHUP можно обработать . То есть программисты могут определить действие, которое они хотят выполнить при получении SIGHUP, например вызов функции , ее игнорирование или восстановление действия по умолчанию.
Действие по умолчанию в POSIX- совместимых системах - аварийное завершение.
Рекомендации
- ^ Керриск, Майкл, изд. (25 июля 2009 г.), «SIGNAL (7)» , Руководство программиста Linux (версия 3.22) , Архив ядра Linux , получено 23 сентября 2009 г..
- ^ Гаррелс, Махтельт, изд. (27 декабря 2008 г.), «Сигналы» , Руководство по Bash для начинающих, вер. 1.11 , The Linux Documentation Project , получено 23 сентября 2009 г..
- ^ Керриск, Майкл, изд. (25 июля 2009 г.), «KILL (2)» , Руководство программиста Linux (версия 3.22) , Архив ядра Linux , получено 23 сентября 2009 г..
Смотрите также
- Сигнал Unix
- RS-232
- Компьютерный терминал