【しぐなる】

シグナル(OS) とは?

最終更新:
💡 プロセスへの通知。既定の動作と処理の変更を確認

UNIXやLinuxで、プロセスやスレッドに出来事を伝える通知の仕組み。OSによる生成や別のプロセスからの送信があり、種類ごとに既定の動作や変更できる処理が異なる。

📌 このページのポイント
通知の種類と処理を確認 端末・他の処理 プロセス SIGINT Ctrl+Cの例 既定:終了 処理を変更可 SIGTERM 終了要求 既定:終了 後処理も設計可 SIGKILL 強制終了 捕捉・無視不可 後処理できない SIGHUP 端末の切断など 既定:終了 再読込は実装次第 SIGSTOPも捕捉・ブロック・無視不可 動作は既定値とアプリの実装による
通常の端末設定でのCtrl+Cと各通知の例。SIGSTOPは終了ではなく実行の一時停止。番号より名前で動作を確認する。
ひよこ ひよこ
Ctrl+Cでプログラムが止まるとき、何が起きているの?
ペンギン先生 ペンギン先生
通常の端末設定では、Ctrl+CからSIGINTが生成され、前面で動くジョブのプロセス群へ送られるよ。SIGINTの既定の動作は終了だけれど、プログラムで処理を変えたり無視したりできる。端末の設定でも変わるので、必ず止まるキーではないんだ。
ひよこ ひよこ
OSだけがシグナルを送るの?
ペンギン先生 ペンギン先生
OSが出来事に応じて生成するほか、別のプロセスや自分自身から送る方法もあるよ。killはシグナルを送るコマンドで、種類を指定しなければ通常はSIGTERMを送る。名前にkillとあっても、いつも強制終了するわけではないんだ。
ひよこ ひよこ
SIGTERMとSIGKILL、SIGSTOPはどう違う?
ペンギン先生 ペンギン先生
SIGTERMの既定は終了だけれど、ハンドラで後処理を行う設計や無視が可能だよ。SIGKILLは強制終了、SIGSTOPは実行を一時停止する。SIGKILLとSIGSTOPは捕捉・ブロック・無視ができない。停止した処理の再開にはSIGCONTを使うんだ。
ひよこ ひよこ
止まらなければ、すぐ強制終了すればいい?
ペンギン先生 ペンギン先生
まず対象と、そのプログラムに合う終了方法を確認しよう。SIGTERMなどで終了を要求し、必要に応じて強制終了を検討する。SIGKILLではアプリ自身の後処理を行えないので、書き込みや作業の途中状態に注意するんだ。
ひよこ ひよこ
SIGHUPを送れば設定を読み直す?
ペンギン先生 ペンギン先生
SIGHUPは端末の切断などに関わる通知で、既定の動作は終了だよ。設定を読み直すのは、そのアプリがそう実装している場合。たとえばnginxのマスタープロセスはHUPで設定を確認して読み直す。nginxで穏やかに終了するシグナルはQUITで、終了方法もアプリごとに確かめよう。
ひよこ ひよこ
ハンドラではログを書いたり、何でもできる?
ペンギン先生 ペンギン先生
Cのシグナルハンドラ内で安全に呼べる関数には制限があるよ。たとえばprintfは安全に呼べる関数ではない。処理を小さくし、必要な作業は通常の処理側へ渡すなど、使う言語や実行環境の方法を確認しよう。ハンドラを登録できないSIGKILLとSIGSTOPにも注意だね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「シグナル(OS)」って出てきたら「プロセスなどへ出来事を伝える通知」と思えばだいたいOK!
📖 おまけ:英語の意味
「Signal」 = 信号・合図
💬 Signalは信号や合図という意味。終了要求や端末の中断など、出来事を伝える通知として使われるよ

参考資料

← 用語集にもどる