web-dev-qa-db-ja.com

多くのUnixプログラムがUSR1のような信号を使用するのはなぜですか?

多くのUnixプログラムは、USR1およびUSR2。たとえば、Nginxの実行可能ファイルを即座にアップグレードするには、kill -USR2

という事は承知しています USR1は「ユーザー定義」シグナルです。つまり、プログラムを作成した人は誰でも「シャットダウン」、「ログをダンプ」、「fooを1000回印刷」などを意味します。しかし、なぜこのarbitrary意的な名前を使用しなければならないのか理解できません。何故なの kill -UPGRADE、またはkill -GRACEFUL_SHUTDOWN? Unixは特定のシグナルのみを許可しますか?

Nginxは次のシグナルも使用します( documentation を参照)。

  • TERM、INT:クイックシャットダウン
  • [〜#〜] quit [〜#〜]:正常なシャットダウン
  • [〜#〜] hup [〜#〜]
    • 設定のリロード
    • 新しい構成で新しいワーカープロセスを開始する
    • 古いワーカープロセスを正常にシャットダウンします
  • USR1:ログファイルを再度開きます
  • USR2:その場で実行可能ファイルをアップグレード
  • [〜#〜] winch [〜#〜]:ワーカープロセスを正常にシャットダウンします

HUP?ウインチ?これらの名前の理由は何ですか?これについてどこでもっと知ることができますか?

70
Nathan Long

OSで利用可能なシグナルは、OSによって定義されます(通常はPOSIXに準拠)-「文字列」ではなく、標準名の整数定数です。 USR1およびUSR2は、特定の意味が付加されていない2つの信号であり、開発者が望む任意の用途を対象としています。

Linuxマシンで、man 7 signal信号処理と信号の概要について。

イベントに応じてこれらの信号を発行するOSに対処する準備ができていれば、他の信号の意味を再定義できます。できますmake HUPは「構成の再読み込み」を意味します-プロセスがハングアップしないこと(端末の損失)がないことが確実であるか、ユーザーではなくOSが送信するケースを処理する準備ができている場合HUPシグナル。

74
Erik

HUPは「ハングアップ」の略です。このシグナルは、制御端末がファイルの終わりに達するとプロセスに送信されます。昔は、通常、制御端末はシリアルポートに接続されていましたが、おそらく電話回線を介したモデムリンクを介して接続されていました。電話接続が切断されると、ローカルモデムがCarrier Detect行を下げ、カーネルがファイルの終わりを報告し、SIGHUP信号が送信されます。

WINCHは「ウィンドウ変更」の略です。制御端末のサイズが変更されると、プロセスに送信されます。明らかな理由から、サイズを変更できる端末は通常、最終的にウィンドウ環境で実行される端末エミュレータ(xtermなど)によって表される擬似端末です。

18
caf

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
9

信号のnamesが(POSIXによって)標準化されているためです。独自のkillタイプの実行可能ファイルを作成して、-UPGRADE必要に応じて、USR1シグナルですが、UNIXに付属の標準killはそれを認識しません。

または、bashエイリアスなどを使用して、エイリアス、関数、またはシェルスクリプトを作成して変換を行うこともできます。

alias upgrade='kill -USR1'

signal.hヘッダーファイルは、実装に依存する実際の値に信号名をマッピングします。

WINCHに関しては、これは少し嫌悪感があると思います。これは、ウィンドウサイズが変更されたときに(特に、制御端末のウィンドウが変更されたときに)アプリケーションに配信される信号です。

このプロセスを使用してワーカースレッドを正常にシャットダウンすることは、プロセスが端末で決して実行されないことを保証できない限り、お勧めできません。アプリケーションを実行していて、ウィンドウを最大化したという理由だけで飛行中のすべての作業をキャンセルすることを決めた場合、私はかなり困惑することを知っています:-)

8
paxdiablo

信号名は、Posixよりも早い時期に由来します。

SIG ** IOT **についてお話します。 DEC PDPメインフレームが使用されていた時代には、使用されるプロセッサには、gentlyシステムをクラッシュします。通常は、リアルタイムサーバーで強制的に再起動します。カーネル全体とデバイスドライバー、および特権プロセス(アセンブラーで記述)がこの方法を使用しました。今日でも、このIOT命令をまだ持っているプロセッサーがあります。

そのため、カーネルが非特権ドメインでIOT命令の実行を経験すると、影響を受けるプロセスに対してSIGIOTを発生させます。

4
Naum

POSIX準拠のプラットフォームでは、SIGUSR1およびSIGUSR2は、ユーザー定義の条件を示すためにプロセスに送信されるシグナルです。それらの記号定数はヘッダーファイルで定義されています signal.h 。信号番号はプラットフォームによって異なる可能性があるため、記号的な信号名が使用されます。

SIGは、信号名の一般的なプレフィックスです。 USRは、ユーザー定義の略語です。

4
Johnsyweb