[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:シグナル
}}}
= シグナル = #SECTION021100000000000000000
プロセスに対して非同期イベントを通知する手段として、Linuxはシグナルと呼ばれる手段を用意している。
プロセスが例外を発生したとき、Linuxカーネルはシグナルに変換してプロセスに通知する。また、カーネル内である事象が発生したことを通知するためにLinuxカーネルがシグナルを生成することもある。(pipe,ttyなどで良く利用される)。また、プロセスがkillシステムコールにより明示的にシグナルを生成することも可能である。
プロセスに対してシグナルを送った(send_sig関数)とき、即対象となるプロセスが削除されたり、そのプロセスが登録したシグナルハンドラが起動されるわけではない。シグナル送信側はシグナルを通知するのみ[[Footnote(killシステムコールが完了してもは相手のプロセスがその時点で終了したことは保証できない。そのあたりの動作を勘違いしたコードを良く見かける)]]であり、シグナル受信処理は全て対象プロセスのコンテキスト上で処理される(do_signal関数)。
シグナルの生成は、例外発生(0番地アクセスなど)やpipe/ttyの状態変更などによりLinuxカーネルが自動的に行うこともあるし、ユーザプロセスがkillシステムコールにより明示的に行うことも可能である。シグナル送信対象プロセスが待ちに入っている場合は、強制起床(wake_up_process)することもある。
プロセスはシグナル受信のチェックをシステムコール出口/例外ハンドラ出口/割り込みハンドラでチェックされる(ソフト割り込みのチェック箇所とほぼ同じ)。もしシグナルを受信していた場合は、シグナル受信処理(do_signal)を開始する。シグナル受信処理(do_signal)では、条件によりプロセスを終了させたり、ユーザシグナルハンドラの実行の準備を行う。ユーザシグナルハンドラの実行のための実装方式に関しては、下図と以下の関数説明を参照して欲しい。どのようなタイミングでシグナルが発生しても(下図signal A B)、シグナルをハンドリングする手順は同じである。
[[Embed(internal22-images:img10.gif)]]
----
{{{ html
<A NAME="CHILD_LINKS"> </A>
}}}
* [internal22-21-関数説明#SECTION021101000000000000000 関数説明]
* [internal22-22-シグナルの無視とマスク#SECTION021102000000000000000 シグナルの無視とマスク]
* [internal22-23-SIGCHLDシグナル#SECTION021103000000000000000 SIGCHLDシグナル]
* [internal22-24-サスペンドシグナル#SECTION021104000000000000000 サスペンドシグナル]
* [internal22-25-シグナル関連のデータ構造と、その他の関数#SECTION021105000000000000000 シグナル関連のデータ構造と、その他の関数]
----
''(NIS)HirokazuTakahashi [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]