SIGVEC(2) — NEWS-OS 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;
解説
システムは、プロセスへ送ることのできるいくつかのシグナルを定義しています。 シグナルの送信は、ハードウェアの割り込みに似ています。 さらなるシグナルの発生はブロックされ、 プロセスの現在のコンテクストがセーブされ、 新しいコンテクストが作られます。 プロセスは、シグナルの送り先のハンドラ を指定すること、あるいは、シグナルが ブロックされる、または無視されるように指定することができます。 また、プロセスは、シグナルが発生したときにシステムがデフォルトの処理を行う ように指定することもできます。 通常、シグナルハンドラは、プロセスの現在のスタック上で 実行されます。この動作は、シグナルが特別なシグナルスタック 上で処理されるように、ハンドラごとに変更することができます。
すべてのシグナルは、 同じプライオリティ を持っています。シグナルルーチンは、それらの呼び出しの原因となったシグナル をブロックした状態で実行されますが、他のシグナルは発生することもあります。 グローバルなシグナルマスク は、プロセスへの送信が現在ブロックされているシグナルの集合を定義します。 あるプロセスのシグナルマスクは、 その親のシグナルマスク (通常は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 がその理由を示すようにセットされます。
エラー
次の項目のうちのいずれかが発生した場合には、 sigvec は失敗し、新しいシグナルハンドラはインストールされません。
[EFAULT] vec または ovec のいずれかが、プロセスのアドレス空間の無効な部分にあるメモリを指し示して いる。
[EINVAL] sig が有効なシグナル番号ではない。
[EINVAL] SIGKILL または SIGSTOP のハンドラを 無視しようとした、 または与えようとした。
[EINVAL] SIGCONT を無視しようとした (デフォルト解釈で SIGCONT は無視される)。
関連事項
kill(1), ptrace(2), kill(2), sigblock(2), sigsetmask(2), sigpause(2), sigreturn(2), sigstack(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> または <machine/cpu.h> 内で定義されています。
Hardware conditionSignalCode
整数のオーバーフローSIGFPEEXC_OV
セグメンテーション違反SIGSEGVSEXC_SEGV
不法命令SIGILLEXC_II
コプロセッサ使用不能SIGILLSEXC_CPU
データバスエラーSIGBUSEXC_DBE
命令バスエラーSIGBUSEXC_IBE
アドレスエラー(読み出し時)SIGBUSEXC_RADE
アドレスエラー(書き込み時)SIGBUSEXC_WADE
ユーザブレークポイント(デバッガが使用)SIGTRAPBRK_USERBP
遅延分岐エミュレーション(分岐)SIGTRAPBRK_BD_TAKEN
遅延分岐エミュレーション(非分岐)SIGTRAPBRK_BD_NOTTAKEN
ユーザシングルステップ(デバッガが使用)SIGTRAPBRK_SSTEPBP
オーバーフローチェックSIGTRAPBRK_OVERFLOW
0 除算チェックSIGTRAPBRK_DIVZERO
範囲エラーチェックSIGTRAPBRK_RANGE
乗算によるオーバーフローSIGTRAPBRK_MULOVF
バグ
このコールの説明には不明確なところがあります。
NEWS-OSRelease 4.2.1R