SIGNAL(3)

名称
signal - 単純化されたソフトウェアシグナル機能

書式
#include <signal.h> void * signal(int sig, void *funcintint) or in FreeBSD's equivalent but easier to read typedef'd version: typedef void *sig_t int sig_t signal(int sig, sig_t func)

解説
この signal() 機能は、もっと一般的な sigaction(2) 機能への単純化された インタフェースです。

シグナルによって、そのドメイン外のプロセスの操作が可能になり、プロセスが 自身または自身のコピー(子プロセス)を操作できます。シグナルには次の2 つの 一般的なタイプがあります。プロセスを終了させるもの、 およびそうではないものです。プログラムの終了を発生させるシグナルは、 回復不可能なエラーの結果であることもありますし、「割り込み」キャラクタを 入力する端末のユーザの結果であることもあります。シグナルが使用されるのは、 プロセスが停止されたときです。バックグラウンドにありながら制御端末に アクセスする必要があるからです ( tty(4) を参照 ) 。シグナルがオプションで生成されるのは、 プロセスが停止された後、再開されるとき、子プロセスのステータスが 変化したとき、または入力が制御端末で準備ができているときです。処置が 行われない場合、ほとんどのシグナルはシグナルを受け取るプロセスの終了という 結果になります。シグナルによっては、代わりにプロセスが シグナルを受け取ってから停止させるものもありますし、プロセスが別の 要求をされていない場合は単に廃棄されるものもあります。 SIGKILL シグナルと SIGSTOP シグナルを除いて、 signal() 関数は、シグナルを捕捉、無視、または割り込み生成できるようにします。 これらのシグナルはファイル <signal.h> に 定義されています。
名前 | デフォルト処置 | 説明
SIGHUP | プロセスの終了 | 端末ラインのハングアップ
SIGINT | プロセスの終了 | プログラムに割り込む
SIGQUIT | コアイメージ作成 | プログラムを終了する
SIGILL | コアイメージ作成 | 不正命令
SIGTRAP | コアイメージ作成 | トラップを追跡する
SIGABRT | コアイメージ作成 abort(2)
呼び出し ( 以前は SIGIOT)
SIGEMT | コアイメージ作成 | エミュレート命令が実行される
SIGFPE | コアイメージ作成 | 浮動小数点例外
SIGKILL | プロセスの終了 | プログラムを抹消する
SIGBUS | コアイメージ作成 | バスエラー
SIGSEGV | コアイメージ作成 | セグメント化侵犯
SIGSYS | コアイメージ作成 | 不存在のシステムコールを呼び出す
SIGPIPE | プロセスの終了 | リーダ(reader)のないパイプに書き込む
SIGALRM | プロセスの終了 | リアルタイマが時間切れ
SIGTERM | プロセスの終了 | ソフトウェア終了シグナル
SIGURG | シグナルを廃棄 | ソケット上に存在する緊急状況
SIGSTOP | プロセスの停止 | 停止する(捕捉または無視できない)
SIGTSTP | プロセスの停止 | キーボードから生成されたシグナルを停止する
SIGCONT | シグナルを廃棄 | 停止の後も継続する
SIGCHLD | シグナルを廃棄 | 子ステータスが変化した
SIGTTIN | プロセス停止 | 制御端末から試みられたバックグラウンド読み取り
SIGTTOU | プロセス停止 | 制御端末について試みられたバックグラウンド書き込み
SIGIO | シグナルを廃棄 |
記述子上で入出力が可能 ( fcntl(2) を参照)
SIGXCPU | プロセスの終了 | プロセス cpu 時間制限を超過 (
setrlimit(2) を参照)
SIGXFSZ | プロセスの終了 | ファイルサイズ制限を超過 (
setrlimit(2) を参照)
SIGVTALRM | プロセスの終了 | 仮想時間アラーム (
setitimer(2) を参照)
SIGPROF | プロセスの終了 | プロファイル化タイマアラーム (
setitimer(2) を参照)
SIGWINCH | シグナルを廃棄 | ウィンドウサイズの変化
SIGINFO | シグナルを廃棄 | キーボードからのステータス要求
SIGUSR1 | プロセスの終了 | ユーザ定義シグナル 1
SIGUSR2 | プロセスの終了 | ユーザ定義シグナル 2

sig パラメータはどのシグナルが受信されたかを指定します。 func プロシージャは、 ユーザがシグナル受信時に処置を選択できるようにします。上記にリストしたように 発生するようシグナルのデフォルト処置を設定するには、 func は SIG_DFL である 必要があります。 SIG_DFL は、デフォルトの処置をリセットします。シグナルを 無視するためには、 func は SIG_IGN にする必要があります。これによって、 後続のシグナルのインスタンスが無視され、中断中のインスタンスが廃棄されます。 SIG_IGN が使用されない場合は、それ以上に発生したシグナルは自動的にブロック され、 func が呼び出されます。

取り扱われるシグナルは、関数が戻るときにはブロックされず、シグナルが発生したときに プロセスは中断したところから継続します。 以前のシグナル機能と違って、ハンドラ func() はシグナルが配信された後も インストールされたままになります。

システムコールによっては、呼び出しが実行中にシグナルが捕捉され、呼び出しが 完了前に終了された場合、呼び出しが自動的に再開されます (ハンドラは sigaction(2) で SA_RESTART フラグを使用してインストールされます)。 影響を 受けるシステムコールには、通信チャネル上または低速デバイス上および ioctl(2) または wait(2) の間の、 read(2), write(2), sendto(2), recvfrom(2), sendmsg(2), および recvmsg(2) が含まれます。 しかし、既にコミット済みの呼び出しは再開始されず、 代わりに部分的な処理成功が返されます ( たとえば、短い読み取りカウント )。

シグナルハンドラをインストールしたプロセスがフォークすると、子プロセスはシグナルを 継承します。 捕捉されたすべてのシグナルが、 execve(2) 関数の呼び出しによって、デフォルトの処置にリセットされます。無視されたシグナルは 無視されたままになります。

戻り値
呼び出しが成功すると、直前の処置が返されます。 そうでない場合、SIG_ERR が返され、グローバル変数 errno が設定されてエラーを示します。

エラー
signal() は次のうちの 1 つが発生すると処理失敗し、処置は取られません。

[EINVAL]
    Sig は有効なシグナル番号ではありません。

[EINVAL]
    SIGKILL または SIGSTOP についてのハンドラを無視または指定しようとする試みが行われます。

関連項目
kill(1), kill(2), ptrace(2), sigaction(2), sigaltstack(2), sigprocmask(2), sigsuspend(2), fpsetmask(3), setjmp(3), tty(4)

歴史
この signal 機能は 4.0BSD で現れました。