シグナル (Unix)
signal()やsigaction()(英語版)システムコールは「シグナルハンドラ」を設定するのに使われる。シグナルハンドラが設定されていないシグナルの場合、デフォルトのハンドラが使われる。さもなくば、シグナルは捉えられ、シグナルハンドラが呼び出される。プロセスはハンドラを設定しなくとも2種類のデフォルト動作を指定できる。シグナルを無視するか(SIG_IGN)、デフォルトのハンドラを使うか(SIG_DFL)である。SIGKILLとSIGSTOPは、捉えることもハンドラで処理することもできないシグナルである。
シグナルハンドラが暗黙的に呼び出すシステムコールとしてsigreturn()がある。これはシグナルハンドラの終了後にカーネルへ処理を戻し、POSIXが要求するシグナルマスクおよびスタックの巻き戻しを実行してから割り込まれたプロセスへ戻ることを目的としている。通常はカーネルがシグナルハンドラを呼び出す際、カーネルがプロセス上にシグナルハンドラのラッパーコードを用意し、シグナルハンドラの終了後に自動的にsigreturn()を呼び出すよう実装しているため、明示的にsigreturn()を呼び出す必要はない。なお、シグナルハンドラがlongjmp()等を用いてシグナル処理開始時とは別の箇所へジャンプする場合は、longjmp()等がsigreturn()と等価な処理を行う。
ゼロ除算 (SIGFPE)、セグメンテーション違反 (SIGSEGV) などの例外によってもシグナルが発生する。経験の浅いプログラマはポインタに不正アドレスを入れてしまい、SIGSEGVを発生させることが多い。これらはデフォルトではプログラムを終了させ、コアダンプを生じる。
カーネルはプロセスに何らかのイベントを通知するためにシグナルを発生させることができる。例えば、プロセスがパイプに書き込んだとき読み込み側プロセスが既にパイプをクローズしている場合にSIGPIPEが送信される。この場合、デフォルトではそのプロセスは終了となるが、パイプをシェルが構築した場合、終了させるのが最も便利である。
SIGABRT は、abort()の実行により送信される。UNIXであれば一般的なシグナルの範疇で扱うが、abort()はC89やそれ以前の各種Cライブラリでもサポートされているため、UNIX以外の環境ではOSの代替機能に頼るか、MS-DOSなどOSのサポートが全くない場合はシグナルの機能を純粋にライブラリのみで実装する。