Почему многие программы Unix используют такие сигналы, как USR1?
многие программы Unix принимают сигналы, такие как USR1
и USR2
. Например, чтобы обновить исполняемый файл для Nginx на лету, вы отправляете kill -USR2
.
Я понимаю, что USR1
является" определяемым пользователем " сигналом, означающим, что тот, кто создал программу, может использовать его, чтобы означать "выключение" или "сброс ваших журналов" или "печать foo тысячу раз" или что-то еще. Но я не понимаю, почему они должны использовать это произвольное имя. Почему бы и нет kill -UPGRADE
или kill -GRACEFUL_SHUTDOWN
? Позволяет ли Unix только определенные сигналы?
пока мы на нем, Nginx также использует следующие сигналы (см. документация):
- ТЕРМИН, INT: быстрое выключение
- выход: безопасное отключение
-
АП:
- настройки перезагрузки
- запуск новых рабочих процессов с новой конфигурацией
- изящно выключите старого рабочего процессы
- USR1: откройте файлы журнала
- USR2 обновление исполняемого файла на лету
- лебедка: изящно завершите рабочие процессы
ать? Уинч? В чем причина этих имен? Где я могу узнать больше об этом?
6 ответов:
сигналы, доступные в ОС, определяются ОС (обычно после POSIX) - это не "строки", а целочисленные константы со стандартными именами.
USR1
иUSR2
это два сигнала, которые не имеют никакого конкретного значения-предназначены для любого произвольного использования разработчиком.на вашей машине linux, прочитайте
man 7 signal
обзор обработки сигналов и сигналов.вы можете изменить значение других сигналов, Если вы готовы иметь дело с ОС, выдающей эти сигналы в ответ на события. Вы можете, например, сделать
HUP
означает "перезагрузить конфигурацию" - до тех пор, пока вы либо уверены, что процесс никогда не получит зависания (потеря терминала), либо вы готовы обрабатывать случаи, когда ОС, а не пользователь отправляет сигнал HUP.
HUP
сокращенно от "повесить трубку". Этот сигнал посылается процессу, если его управляющий терминал достигает конца файла. В старые времена управляющие терминалы обычно подключались к последовательным портам, возможно, через модемную линию по телефонной линии. Если телефонное соединение было отключено, локальный модем понизит линию обнаружения несущей, что приведет к тому, что ядро сообщит о конце файла иSIGHUP
сигнал был послан.
WINCH
сокращенно от "изменение окна". Он отправляется процессу, если его управляющий терминал изменяет размер. По очевидным причинам терминалы, которые могут изменять размер, обычно являются псевдотерминалами, в конечном счете представленными эмулятором терминала, работающим в оконной среде (например,xterm
).
потому что имена из сигналов стандартизированы (по POSIX). Вы можете написать свой собственный исполняемый файл типа kill, чтобы взять
-UPGRADE
Если вы хотите и имеете его поставитьUSR1
сигнал, но стандартkill
который поставляется с UNIX не распознает его.кроме того, вы можете создать псевдоним, функцию или сценарий оболочки, чтобы сделать перевод для вас, например, с помощью
bash
псевдоним:alias upgrade='kill -USR1'
The
signal.h
заголовочный файл карты имена сигналов соответствуют их фактическим значениям, которые зависят от реализации.С точки зрения
WINCH
, Я считаю это немного кощунство. Это сигнал, который поступает в приложения при изменении размера их окна (в частности, при изменении окна их управляющего терминала).использование его для изящного закрытия рабочих потоков не является хорошей идеей, если вы не можете гарантировать, что процесс никогда не будет работать в терминале. Я знаю, что был бы очень обижен, если бы был запустил приложение и решил отменить все работы в полете только потому, что я развернул окно: -)
попробовать
kill -l
и найти ответ самостоятельно:1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
на платформах, совместимых с POSIX,
SIGUSR1
иSIGUSR2
- это сигналы, посылаемые процессу для указания определенных Пользователем условий. Символьные константы для них определяются в заголовочном файлеsignal.h
. Символические имена сигналов используются потому, что номера сигналов могут варьироваться в зависимости от платформы.
SIG
является общим префиксом для имен сигналов.USR
- это сокращение от user-defined.
имена сигналов происходят из более ранних времен, чем Posix.
Я хочу поговорить о SIG**IOT**. Во времена, когда использовались мэйнфреймы DEC PDP, используемые процессоры имели специальную инструкцию IOT (I / O Trap), которая часто использовалась для осторожно сбой системы -- обычно заставляя его перезагрузиться (в реальном времени серверов). Все ядро вместе с драйверами устройств и привилегированными процессами (написанными на ассемблере) использовало этот метод. Даже сегодня, есть процессоры, которые еще много инструкция.
Итак, когда ядро испытывает выполнение инструкции IOT в непривилегированном домене, оно вызывает SIGIOT для затронутого процесса.