SIGVEC(2) — UNIX Programmer’s Manual
名称
sigvec − ソフトウェアシグナル機能
形式
#include <signal.h>
struct sigvec {
int(∗sv_handler)();
intsv_mask;
intsv_flags;
};
sigvec(sig, vec, ovec)
int sig;
struct sigvec ∗vec, ∗ovec;
解説
システムは、プロセスへ送ることのできるいくつかのシグナルを定義しています。 シグナルの送信は、ハードウェアの割り込みに似ています。 シグナルはブロックされ、プロセスの現在のコンテクストがセーブされ、 新しいコンテクストが作られます。 プロセスは、シグナルの送り先の handler を指定すること、あるいは、シグナルが block または ignore されるように指定することができます。 また、プロセスは、シグナルが発生したときにシステムが行うデフォルトの処理を 指定することもできます。通常、シグナルハンドラは、プロセスの現スタックで 実行します。これは、シグナルが特別な シグナルスタック (signal stack) へ取り込まれるように、ハンドラごとに変更することができます。
すべてのシグナルは、 同じ プライオリティ を持っています。シグナルルーチンは、それらの呼び出しをブロックさせたシグナル とともに実行します。 他のシグナルは発生することもあります。 グローバルな signal mask は、プロセスへの送信が現在ブロックされているシグナルのセットを定義します。 あるプロセスのシグナルマスクは、その親のシグナルマスク(通常は0)から初期設定 されます。シグナルマスクは、 sigblock(2) または sigsetmask(2) コールを用いるか、またはシグナルがプロセスへ送られたときに、変更することが できます。
プロセスにシグナル条件があると、該当するシグナルは、 そのプロセスのペンディングとなっているシグナルのセットに追加されます。 そのシグナルがプロセスによって現在 ブロックされていなければ、 そのシグナルはプロセスへ送られます。 シグナルが送られると、プロセスの現在の状態がセーブされ、新しいシグナルマスクが 計算され(後述)、そしてシグナルハンドラが呼び出されます。 ハンドラに対するコールは、 シグナル処理ルーチンが正常にリターンした場合に プロセスがシグナルの送られる前のコンテクストで実行を 再開できるように修正されます。 プロセスがそれとは異なるコンテクストで実行の再開を 望むのであれば、そのプロセスは自分で以前のコンテクストを 復元しなければなりません。
シグナルがプロセスへ送られると、 そのプロセスのシグナルハンドラが実行される間だけ(もしくは、 sigblock または sigsetmask コールが出されるまで)新しいシグナルマスクがインストールされます。 この新しいマスクは、現在のシグナルマスクを取り出して、送られるべきシグナルを 加算し、さらに呼び出されるハンドラに関するシグナルマスク内で 論理和をとることによって作成されます。
sigvec は、 ある特定のシグナルのためのハンドラを 割り当てます。 vec は、ゼロ以外である場合には、指定されたシグナルが送られてきたときに使用される ハンドラルーチンとマスクを指定します。 さらに、 sv_flags 内で SV_ONSTACK ビットがセットされている場合には、 システムは sigstack(2) を用いて指定された シグナルスタック にあるプロセスへそのシグナルを送ります。 ovec がゼロ以外である場合には、 そのシグナルの以前の処理情報がユーザに返されます。
以下に、インクルードファイル <signal.h> に収められている全シグナルのリストを示します。
SIGHUP1ハングアップ
SIGINT2割り込み
SIGQUIT3∗中止
SIGILL4∗認められていない命令
SIGTRAP5∗トレーストラップ
SIGIOT6∗IOT命令
SIGEMT7∗EMT命令
SIGFPE8∗浮動小数点例外
SIGKILL9強制終了(キャッチもブロックも無視もできない)
SIGBUS10∗バスエラー
SIGSEGV11∗セグメンテーション違反
SIGSYS12∗システムコールに対する無効な引数
SIGPIPE13読み取りが行われていないパイプへの書き込み
SIGALRM14アラームクロック
SIGTERM15ソフトウェア終了シグナル
SIGURG16•ソケットに至急条件がある
SIGSTOP17†停止(キャッチもブロックも無視もできない)
SIGTSTP18†キーボードからの停止シグナル
SIGCONT19•停止のあとの継続(ブロックできない)
SIGCHLD20•子のステータスが変化した
SIGTTIN21†バックグラウンド読み取りが制御端末装置から試みられた
SIGTTOU22†バックグラウンド書き込みが制御端末装置へ試みられた
SIGIO23•ディスクリプタで入出力が不可能である(fcntl(2)参照)
SIGXCPU24CPU時間制限をオーバーした(setrlimit(2)参照)
SIGXFSZ25ファイルサイズの制限をオーバーした(setrlimit(2)参照)
SIGVTALRM26仮想時間アラーム(setitimer(2)参照)
SIGPROF27プロフィーリングタイマアラーム(setitimer(2)参照)
SIGWINCH28•ウィンドウサイズの変更
SIGUSR130ユーザ定義シグナル1
SIGUSR231ユーザ定義シグナル2
上記のリストでアスタリスク(∗)が付けられているシグナルは、 キャッチも無視もされない場合には、 コアイメージを 生じさせます。
一度シグナルハンドラがインストールされると、別の sigvec コールが出されるまで、 または execve(2) が実行されるまでインストールされたままになります。シグナルに対応する デフォルトの処理は、sv_handler を SIG_DFL にセットすることによって、 インストールしなおすことができます。デフォルトの処理は、 • または † の付けられているシグナル以外のシグナルでは終了 (∗ の付けられているシグナルではコアイメージが生じる)です。 • の付けられているシグナルは、 処理が SIG_DFL である場合には捨てられます。 † の付けられているシグナルは、 プロセスを停止させます。 sv_handler が SIG_IGN である場合には、 そのシグナルは、それ以降無視され、そのシグナルでペンディングとなっているものは 捨てられます。
いくつかのシステムコールの実行中に、キャッチされるシグナルが発生した場合、 通常、そのシステムコールは再スタートされます。 sv_flags 内の SV_INTERRUPT ビットをセットすることによって、そのコールを 強制的に終了させることができます。 その場合、EINTR エラーが返されます。 このような影響を受けるシステムコールは、(ファイルではなく、 端末装置のような)速度の遅いデバイスにおける read(2) または write(2)、 それに wait(2) です。
fork(2) または vfork(2) を実行すると、子プロセスは、すべてのシグナル、シグナルマスク、シグナルスタック、 および再スタート/割り込みフラグを受け継ぎます。
execve(2) は、すべてのキャッチされるシグナルをデフォルトの処理にリセットし、 すべてのシグナルをユーザスタックでキャッチされるようにリセットします。 無視されるシグナルはそのまま無視され、シグナルマスクはそのまま同じものになり、 システムコールに割り込むシグナルは割り込みを行うことを継続します。
注意事項
vec で指定されるマスクは、 SIGKILL、SIGSTOP、または SIGCONT をブロックすることは許されません。
NEWS-OS 2.X (4.2BSD)では、 SV_INTERRUPTフラグは使用することはできません。 したがって、古いバージョンとの互換性が必要とされる場合には、 このフラグは使用すべきではありません。
リターン値
このコールが成功した場合には、値 0 が返されます。 戻り値 −1 はエラーが発生したことを示し、 errno がその理由を示すようにセットされます。
エラー
次の項目のうちの1つまたは複数が発生した場合には、 sigvec は失敗し、新しいシグナルハンドラはインストールされません。
[EFAULT] vec または ovec のいずれかが、プロセスのアドレススペースの無効な部分にあるメモリを指し示して いる。
[EINVAL] sig が有効なシグナル番号ではない。
[EINVAL] SIGKILL または SIGSTOP のハンドラを 無視しようとした、 または与えようとした。
[EINVAL] SIGCONT を無視しようとした(デフォルト解釈で SIGCONT は無視される)。
関連事項
kill(1), ptrace(2), kill(2), sigblock(2), sigsetmask(2), sigpause(2), sigstack(2), sigvec(2), setjmp(3), siginterrupt(3), tty(4)
バグ
このコールの説明には不明確なところがあります。
注意事項(NEWSに関して)
ハンドラルーチンは、 次のように宣言することができます。
handler(sig, code, scp)
int sig, code;
struct sigcontext ∗scp;
ここで、 sig はシグナル番号であり、 ハードウェアの障害およびトラップが、 下記の定義に従ってシグナル番号にマップされます。 code は、下記のリストにある定数です。 scp は、 (<signal.h> で定義されている) sigcontext 構造体へのポインタであり、 この構造体は、 シグナルが送られる前のコンテクストを 復元するために使用されます。
以下に、 ハードウェアトラップの、 シグナルとコードへのマッピングの定義を 示します。 これらの記号はすべて、 <signal.h> 内で定義されています。
ハードウェア条件シグナルコード
算術演算トラップ
整数のオーバーフローSIGFPEFPE_INTOVF_TRAP
ゼロによる整数の除算SIGFPEFPE_INTDIV_TRAP
浮動小数点数オーバーフロートラップSIGFPEFPE_FLTOVF_TRAP
ゼロによる浮動小数点/10進数の除算SIGFPEFPE_FLTDIV_TRAP
浮動小数点数アンダーフロートラップSIGFPEFPE_FLTUND_TRAP
10進数オーバーフロートラップSIGFPEFPE_DECOVF_TRAP
サブスクリプト範囲SIGFPEFPE_SUBRNG_TRAP
浮動小数点数オーバーフローSIGFPEFPE_FLTOVF_FAULT
ゼロによる浮動小数点数除算SIGFPEFPE_FLTDIV_FAULT
浮動小数点数アンダーフローSIGFPEFPE_FLTUND_FAULT
予約アドレッシングSIGILLILL_RESAD_FAULT
特権命令違反SIGILLILL_PRIVIN_FAULT
予約オペランドSIGILLILL_RESOP_FAULT
NEWS-OSRelease 3.3