シグナル (Unix)
Single UNIX Specification では、以下のシグナルを <signal.h> で定義すべきものとして指定している。
シグナル受信時のデフォルト動作は以下のような処理がある:
T: プロセスの異常終了。exit() システムコールを実行したのと同様の終了の仕方だが、wait()またはwaitpid()でそのプロセスの終了を待ち合わせていたプロセスには、シグナル受信で終了したことを示す異常終了コードが返される。
A: プロセスの異常終了。設定されていればコアダンプを生成する。
I: シグナルを無視する。
S: プロセスの実行を中断(一時停止)する。
C: 中断されていたプロセスの実行を再開する。中断されていないプロセスでは無視する。
下記表のシグナル番号は Linux x86 の場合であり、他のOS・他のCPUでは異なる。Linux ARM もシグナル番号は同じ。
注:アスタリスク付の項目は、X/Open System Interfaces (XSI) による拡張を示す。(SUS) とある部分はSUSにある表現の引用(を和訳したもの)。
上述以外に、プロセスは擬似シグナル(番号0)を送信することもできる。これは実際にはシグナルを送信せずにシグナル送信時のエラーチェックをし、例えば宛先プロセスが存在するかどうかをチェックするのに便利である。
以下のような操作によりシグナルが送信される。
ユーザーがあるプロセスの端末のキーを押下したとき、端末がシグナルを発生する。 CTRL+C(古いUNIXでは DEL キー)を押下すると、SIGINT を送信し、デフォルトではそのプロセスを終了させる。 CTRL+Z を押下すると、SIGTSTP を送信し、デフォルトではプロセスの実行を中断(一時停止)させる。 CTRL+\ を押下すると、SIGQUIT を送信し、デフォルトではプロセスを終了させコアダンプさせる。 (なお、これらのキーの組み合わせは stty(英語版) コマンドで変更可能である)
kill(2) システムコールを使うと、権限があれば指定したプロセス(群)に指定したシグナルを送信できる。同様に kill(1) コマンドでユーザーがプロセス(群)にシグナルを送信することもできる。また、raise(3) を使えばカレントプロセス(またはスレッド)に指定したシグナルを送信できる。