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