1. ホーム
  2. unix

[解決済み] なぜ Unix プログラムは、(USR1 などではなく) 意味のあるプログラム定義名を持つシグナルを持つことができないのでしょうか?

2023-06-11 03:54:50

質問

多くの Unix プログラムは、以下のようなシグナルを受け付けます。 USR1USR2 . 例えば、Nginx の実行ファイルをその場でアップグレードする場合 kill -USR2 .

私は、以下のことを理解しています。 USR1 は "user defined" シグナルで、プログラムを作った人が誰でも "shut down" や "dump your logs" や "print foo a thousand times" などという意味で使うことができることを意味しています。しかし、なぜこのような任意の名前を使わなければならないのか、私には理解できません。なぜ kill -UPGRADE あるいは kill -GRACEFUL_SHUTDOWN ? Unixは特定の信号しか許さないのでしょうか?

ついでに言うと、Nginxは以下のようなシグナルも使っています( ドキュメント ):

  • TERM、INT : クイックシャットダウン
  • QUIT : グレースフルシャットダウン
  • HUP :
    • コンフィギュレーション再読み込み
    • 新しいワーカープロセスを新しいコンフィギュレーションで起動する
    • 古いワーカープロセスをグレースフルにシャットダウン
  • USR1 : ログファイルを開き直す
  • USR2 : 実行ファイルをオンザフライでアップグレード
  • ウィンチ : ワーカープロセスを緩やかにシャットダウンする

HUP? WINCH?これらの名前の理由は何ですか?どこで詳しく知ることができるのでしょうか?

どのように解決するのですか?

OS 上で利用可能なシグナルは OS によって定義されます (通常は POSIX に従います) - それらは "文字列" ではなく、標準的な名前を持つ整数定数です。 USR1USR2 は、特定の意味を持たない2つのシグナルで、開発者が望む任意の用途に使われることを意図しています。

あなたのLinuxマシン上で man 7 signal を読んでください。

イベントに応じてシグナルを発行するOSに対応する準備ができていれば、他のシグナルの意味を再定義することができます。例えば HUP は、プロセスが決してハングアップ (端末の損失) しないことが確実であるか、ユーザーではなく OS が HUP 信号を送信するケースを処理する用意がある限り、"reload configuration" を意味するようにすることができます。