EN JA
SIGNAL(3)
SIGNAL(3) FreeBSD Library Functions Manual SIGNAL(3)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < signal.h>

void
(*signal( int sig, void (*func)(int)))(int);

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) を参照)。シグナルは、プロセスが停止された後再開されるとき、子プロセスのステータスが変化したとき、または入力が制御端末で準備ができているとき状況に応じて生成されます。ほとんどのシグナルは、処置が行われない場合にそれらを受け取るプロセスの終了という結果になります。いくつかのシグナルは代わりに、停止させられているためにそれらを受け取るプロセスを引き起こすか、プロセスが別に要求をされていない場合は単に廃棄されます。 SIGKILLSIGSTOP シグナルを除いて、 signal() 関数は、シグナルを捕捉するか、無視するか、または割り込みを生成できるようにします。これらのシグナルは、ファイル < signal.h> に定義されています:

番号 名前 デフォルトの動作 説明
1 SIGHUP プロセスを終了 端末行のハングアップ
2 SIGINT プロセスを終了 プログラムに割り込む
3 SIGQUIT コアイメージを作成 プログラムを終了
4 SIGILL コアイメージを作成 不正命令
5 SIGTRAP コアイメージを作成 トラップを追跡
6 SIGABRT コアイメージを作成 プログラムをアボート (以前は, SIGIOT)
7 SIGEMT コアイメージを作成 実行されたエミュレート命令
8 SIGFPE コアイメージを作成 浮動小数点例外
9 SIGKILL プロセスを終了 プログラムを kill
10 SIGBUS コアイメージを作成 バスエラー
11 SIGSEGV コアイメージを作成 セグメンテーション侵害
12 SIGSYS コアイメージを作成 呼び出された存在しないシステムコール
13 SIGPIPE プロセスを終了 読み込み側のないパイプに書き込み
14 SIGALRM プロセスを終了 時間切れのリアルタイムタイマ
15 SIGTERM プロセスを終了 ソフトウェア終了シグナル
16 SIGURG シグナルを廃棄 ソケット上に存在する緊急状態
17 SIGSTOP プロセスを停止 停止 (捕捉または無視できない)
18 SIGTSTP プロセスを停止 キーボードから生成されたシグナルを停止
19 SIGCONT シグナルを廃棄 停止の後の継続
20 SIGCHLD シグナルを廃棄 子プロセスの状態が変更された
21 SIGTTIN プロセスを停止 制御端末から試みられたバックグラウンドの読み込み
22 SIGTTOU プロセスを停止 制御端末に試みられたバックグラウンドの書き込み
23 SIGIO シグナルを廃棄 記述子で I/O が可能 ( fcntl(2) を参照)
24 SIGXCPU プロセスを終了 超過した CPU 時間の制限 ( setrlimit(2) を参照)
25 SIGXFSZ プロセスを終了 超過したファイルサイズの制限 ( setrlimit(2) を参照)
26 SIGVTALRM プロセスを終了 仮想時間のアラーム ( setitimer(2) を参照)
27 SIGPROF プロセスを終了 プロファイルのタイマのアラーム ( setitimer(2) を参照)
28 SIGWINCH シグナルを廃棄 ウィンドウサイズの変更
29 SIGINFO シグナルを廃棄 キーボードから状態要求
30 SIGUSR1 プロセスを終了 ユーザ定義シグナル 1
31 SIGUSR2 プロセスを終了 ユーザ定義シグナル 2
32 SIGTHR プロセスを終了 スレッド割り込み
33 SIGLIBRT プロセスを終了 リアルタイムライブラリ割り込み

sig 引数は、どのシグナルが受け取られたかを指定します。 func 手続きは、ユーザがシグナルを受け取った時の処置を選択できるようにします。上記のリストのように発生するシグナルのデフォルト処置を設定するために、 func は、 SIG_DFL であるべきです。 SIG_DFL は、デフォルトの動作をリセットします。シグナルを無視するために、 func は、 SIG_IGN であるべきです。これによって、シグナルの後続するインスタンスは、無視され、保留中のインスタンスは、破棄されます。 SIG_IGN が使用されないなら、さらなるシグナルの発生は、自動的にブロックされ、 func が呼び出されます。

操作されるシグナルは、関数が返るとき、ブロックが取り除かれ、プロセスは、シグナルが発生したとき、それが中断したところから継続します。

以前のシグナルの機能と異なり、ハンドラ func() は、シグナルが配信された後にインストールされ続けます。

システムコールによっては、呼び出しが実行している間にシグナルが補足され、呼び出しが時期尚早に終了するなら、呼び出しは、自動的に再開されます。 signal(3) でインストールされたあらゆるハンドラは、あらゆる再開可能なシステムコールが、シグナルの受信で返らないことを意味して、 SA_RESTART フラグ設定があります。影響を受けるシステムコールは、通信チャネルまたは低速度のデバイスでの read(2), write(2), sendto(2), recvfrom(2), sendmsg(2)recvmsg(2) および ioctl(2) または wait(2) の間を含んでいます。しかしながら、既にコミット (委託) された呼び出しは、再開されませんが、代わりに、部分的な成功 (例えば、短い読み込みカウント) を返します。これらのセマンティクスは、 siginterrupt(3) ととともに変化するかもしれません。

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

プロセスがシグナル SIGCHLD のための動作として明白に SIG_IGN を指定すると、呼び出しプロセスの子供が終了するとき、システムは、ゾンビプロセスを作成しません。結果として、システムは子プロセスから終了 (exit) ステータスを捨てます。呼び出しプロセスが wait(2) または同等物への呼び出しを発行すると、呼び出しプロセスの子供がすべて終了するまでブロックし、 errnoECHILD に設定して、-1 の値を返します。

シグナルハンドラで使用するために安全であると考えられる関数のリストに関しては、 sigaction(2) を参照してください。

戻り値

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

エラー

signal() 関数は、失敗し、次のうちの 1 つが発生するなら、処置は、行われません:
[ EINVAL]
sig 引数が有効なシグナル番号ではありません。
[ EINVAL]
SIGKILL または SIGSTOP のためのハンドラを無視するまたは供給する試みが行われます。

歴史

signal 機能は、 4.0BSD で登場しました。 SIGCHLD を無視するために子供のゾンビの作成を避けるオプションは、 FreeBSD 5.0 で登場しました。
June 7, 2004 FreeBSD