シグナル(sigaction / kill / raise)
Ctrl+Cや異常終了の正体であるシグナル。sigactionでハンドラを登録し、killやraiseで送る流れと、捕まえられないSIGKILL/SIGSTOPの存在を押さえる。
Ctrl+Cでプログラムが止まるのはなぜか。ゼロ除算やヌルポインタ参照で異常終了するとき、誰がそれを告げているのか。その答えがシグナルだ。シグナルは、プロセスに「何かが起きた」と非同期に知らせる仕組みである。
🧩 シグナルには種類がある
シグナルは名前と番号を持つ。Ctrl+Cで送られる SIGINT、kill コマンドの既定である SIGTERM、不正なメモリアクセスで発生する SIGSEGV、タイマ用の SIGALRM など、それぞれ役割が決まっている。
💡
ポイントNOTE: シグナルには既定の動作がある。多くは「プロセス終了」だが、SIGSEGV のようにコアダンプを残すもの、SIGCHLD のように既定では無視されるものもある。
🧩 sigaction で捕まえる
多くのシグナルは、自分でハンドラ(受け取ったときに呼ばれる関数)を登録して挙動を変えられる。登録には sigaction を使う。これで Ctrl+C を押されても即終了せず、後始末をしてから終わる、といった制御ができる。
💡
ポイントEX: `int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);`。`act.sa_handler` に自分の関数を入れて `sigaction(SIGINT, &act, &oldact);` とすれば、以後 Ctrl+C でその関数が呼ばれる。
💡
ポイントTIP: ただし SIGKILL と SIGSTOP だけは捕まえることも無視することもできない。暴走したプロセスを確実に止める最後の手段として、OSが握っているためだ。
🧩 kill / raise で送る
シグナルは受け取るだけでなく送れる。他のプロセスへは kill、自分自身へは raise を使う。kill という名前だが、実体は「番号を指定してシグナルを送る」操作であり、必ずしも殺すわけではない。
💡
ポイントANALOGY: シグナルは肩を叩く合図に近い。作業中の相手(プロセス)に、口頭で長い説明はできないが「止まれ」「後で確認して」くらいの短い合図を、割り込んで届けられる。ハンドラはその合図に対する反応を決めておくもの。
この項目に出てくる用語
シグナルしぐなる
プロセスに非同期でイベントを知らせる仕組み。
シグナルハンドラしぐなるはんどら
シグナル受信時に呼ばれる関数。