Почему многие программы Unix используют такие сигналы, как USR1? - PullRequest
70 голосов
/ 18 марта 2011

Многие программы Unix принимают такие сигналы, как USR1 и USR2. Например, чтобы обновить исполняемый файл для Nginx на лету, вы отправляете kill -USR2.

Я понимаю, что USR1 - это "определяемый пользователем" сигнал, означающий, что тот, кто создал программу, может использовать ее для обозначения "выключить", "сбросить ваши журналы" или "распечатать тысячу раз" или что-то еще. Но я не понимаю, почему они должны использовать это произвольное имя. Почему не kill -UPGRADE или kill -GRACEFUL_SHUTDOWN? Разрешает ли Unix только определенные сигналы?

Пока мы это делаем, Nginx также использует следующие сигналы (см. документация ):

  • TERM, INT : быстрое отключение
  • ВЫЙТИ : постепенное отключение
  • HUP :
    • Конфигурация перезагрузки
    • Запуск новых рабочих процессов с новой конфигурацией
    • Изящно завершает работу старых рабочих процессов
  • USR1 : вновь открыть файлы журналов
  • USR2 : исполняемый файл обновления на лету
  • WINCH : изящное завершение рабочих процессов

HUP? Winch? В чем причина этих имен? Где я могу узнать больше об этом?

Ответы [ 6 ]

74 голосов
/ 18 марта 2011

Сигналы, доступные в ОС, определяются ОС (обычно после POSIX) - это не «строки», а целочисленные константы со стандартными именами.USR1 и USR2 - это два сигнала, которые не имеют определенного специфического значения - предназначены для любого произвольного использования, которое хочет разработчик.

На вашем компьютере с Linux прочитайте man 7 signal для обзора обработки сигналов и сигналов..

Вы можете переопределить значение других сигналов, если вы готовы иметь дело с ОС, выдающей эти сигналы в ответ на события.Например, вы можете сделать HUP означающим «перезагрузить конфигурацию» - при условии, что вы либо уверены, что процесс никогда не будет зависать (потеря терминала), либо вы готовы обрабатывать случаи, когда ОС, а не пользователь отправляетсигнал HUP.

18 голосов
/ 19 марта 2011

HUP - это сокращение от "зависания".Этот сигнал отправляется процессу, если его управляющий терминал достигает конца файла.В старые времена управляющие терминалы обычно подключались к последовательным портам, возможно, через модемную линию по телефонной линии.Если бы телефонное соединение было прервано, локальный модем опустил бы строку Carrier Detect, что привело бы к тому, что ядро ​​сообщило об окончании файла и отправил сигнал SIGHUP.для "изменения окна".Он отправляется процессу, если его управляющий терминал меняет размер.По понятным причинам терминалы, которые могут изменять размер, обычно являются псевдотерминалами, в конечном счете представленными эмулятором терминала, работающим в среде управления окнами (например, xterm).

9 голосов
/ 19 марта 2011

Попробуйте 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
8 голосов
/ 18 марта 2011

Поскольку имена сигналов стандартизированы (POSIX).Вы можете написать свой собственный исполняемый файл типа kill, который будет принимать -UPGRADE, если вы хотите, и он будет выдавать сигнал USR1, но стандартный kill, поставляемый с UNIX, не распознает его.Вы можете создать псевдоним, функцию или сценарий оболочки, чтобы выполнить перевод для вас, например, с помощью псевдонима bash:

alias upgrade='kill -USR1'

Заголовочный файл signal.h отображает имена сигналов на ихфактические значения, которые зависят от реализации.

В терминах WINCH я считаю это немного мерзостью.Это сигнал, который доставляется приложениям при изменении размера их окон (в частности, когда изменяется окно их управляющего терминала).

Использование его для изящного отключения рабочих потоков не является хорошей идеей, если вы не можете гарантироватьпроцесс никогда не будет работать в терминале.Я знаю, что был бы довольно раздражен, если бы я запускал приложение, и он решил отменить все работы в полете только потому, что я развернул окно: -)

4 голосов
/ 05 марта 2013

Имена сигналов происходят с более ранних времен, чем Posix.

Я хочу поговорить о SIG ** IOT **. В те времена, когда использовались мэйнфреймы DEC PDP, используемые процессоры имели специальную инструкцию IOT (I / O Trap), которая часто использовалась для осторожного сбоя системы - обычно вынуждая его перезагружаться ( в серверах реального времени). Все ядро ​​вместе с драйверами устройств и привилегированными процессами (написано на ассемблере) использовали этот метод. Даже сегодня есть процессоры, которые все еще имеют эту инструкцию IOT.

Итак, когда ядро ​​испытывает выполнение инструкции IOT в непривилегированном домене, оно вызывает сигнал SIGIOT для затронутого процесса.

4 голосов
/ 18 марта 2011

На POSIX-совместимых платформах SIGUSR1 и SIGUSR2 - это сигналы, отправляемые процессу для указания пользовательских условий. Символические константы для них определены в заголовочном файле signal.h. Символьные имена сигналов используются потому, что номера сигналов могут различаться на разных платформах.

SIG - это общий префикс для имен сигналов. USR является сокращением для определенного пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...