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) を参照)。シグナルは、プロセスが停止された後再開されるとき、子プロセスのステータスが変化したとき、または入力が制御端末で準備ができているとき状況に応じて生成されます。ほとんどのシグナルは、処置が行われない場合にそれらを受け取るプロセスの終了という結果になります。いくつかのシグナルは代わりに、停止させられているためにそれらを受け取るプロセスを引き起こすか、プロセスが別に要求をされていない場合は単に廃棄されます。 SIGKILL と SIGSTOP シグナルを除いて、 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 が呼び出されます。
操作されるシグナルは、関数が返るとき、ブロックが取り除かれ、プロセスは、シグナルが発生したとき、それが中断したところから継続します。
システムコールによっては、呼び出しが実行している間にシグナルが補足され、呼び出しが時期尚早に終了するなら、呼び出しは、自動的に再開されます。 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) または同等物への呼び出しを発行すると、呼び出しプロセスの子供がすべて終了するまでブロックし、 errno を ECHILD に設定して、-1 の値を返します。
シグナルハンドラで使用するために安全であると考えられる関数のリストに関しては、 sigaction(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), wait(2), fpsetmask(3), setjmp(3), siginterrupt(3), tty(4)歴史
signal 機能は、 4.0BSD で登場しました。 SIGCHLD を無視するために子供のゾンビの作成を避けるオプションは、 FreeBSD 5.0 で登場しました。June 7, 2004 | FreeBSD |