SIGVEC(2) FreeBSD システムコールマニュアル SIGVEC(2)
名称
sigvec − ソフトウェアシグナル機能 |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <signal.h> struct sigvec { void (*sv_handler)(); |
int sv_mask; |
||
int sv_flags; |
}; int |
sigvec(int sig, struct sigvec *vec, struct sigvec *ovec); |
解説 |
このインタフェースは、 sigaction(2) に置き換えられました。 システムではシグナルの集合を定義しており、これらはプロセスに配信されるこ とがあります。シグナルの配信は、ハードウェア割込みの発生に似ています。シ グナルのさらなる発生はブロックされ、現在のプロセスコンテキストは保存され て、新しいプロセスコンテキストが作成されます。プロセスは、シグナルの配信 先 handler を指定することもあれば、シグナルを ブロックすることおよび 無視 することを指定することもあります。シグナルが発生した場合に、システムがデ フォルトのアクションを取ることを指定することも可能です。通常の場合、シグ ナルハンドラは、プロセスの現行スタックで動作します。これは、ハンドラ毎に 変更して、シグナルが特殊な シグナルスタックでハンドルされるようにできま す。 すべてのシグナルの 優先順位は同じです。シグナルルーチンは、呼び出しの原因 となったシグナルが ブロックされた状態で動作しますが、その他のシグナルが発 生する可能性はあります。グローバルな シグナルマスクには、プロセスへの配信 が現在ブロックされているシグナルの集合が定義されています。プロセスのシグ ナルマスクは、親のシグナルマスクに初期化されます (通常は 0)。シグナルマス クは、 sigblock(2) か sigsetmask(2) を呼び出すか、シグナルがプロセスに配 信された場合に変更され得ます。 シグナル条件がプロセスで発生すると、そのシグナルが、プロセスで保留になっ ているシグナルの集合に追加されます。そのシグナルがプロセスで現在 ブロック されていない場合は、プロセスに配信されます。シグナルが配信されると、プロ セスの現在の状態が保存され、新しいシグナルマスクが以下で説明するように算 出されて、シグナルハンドラが呼び出されます。ハンドラの呼び出しは、シグナ ル処理ルーチンが正常に戻った場合にプロセスがシグナル配信前のコンテキスト で実行を再開するように編成されます。プロセスが別のコンテキストでの再開を 望む場合は、プロセスが前のコンテキストそのものを回復するように編成する必 要があります。 シグナルがプロセスに配信されると、新しいシグナルマスクが、プロセスのシグ ナルハンドラが続く間 (または sigblock(2) か sigsetmask(2) が呼び出される まで) 設置されます。このマスクは、現在のシグナルマスクに、配信されるシグ ナルを追加し、呼び出されるハンドラに関連したシグナルマスクとの論理和 (or) を取って形成されます。 sigvec() 関数は、特定のシグナルにハンドラを割り当てます。 vec を 0 以外に した場合は、指定したシグナルを配信する場合に使用するハンドラルーチンとマ スクが指定されます。 SV_ONSTACK ビットが sv_flags で設定されている場合、 システムは、 sigaltstack(2) で指定された シグナルスタックのプロセスにシグ ナルを配信します。 ovec を 0 以外にした場合は、シグナルの前の処理情報が ユーザに返されます。 以下はすべてのシグナルのリストです。名称は、インクルードファイル <signal.h> と同じです: 名称 デフォルトアクション 説明 シグナルハンドラが設置されると、 sigvec() を再度呼び出すか execve(2) を実 行するまでシグナルハンドラは設置されたまま残ります。シグナルに固有なデ フォルトアクションへは、 sv_handler を SIG_DFL に設定することでリセットで きます。デフォルトは、プロセスの終了 (コアダンプが取られることもありま す)、アクションなし、プロセスの停止、プロセスの継続です。それぞれのシグナ ルのデフォルトアクションについては、上のシグナルリストを参照してくださ い。 sv_handler が SIG_IGN である場合、シグナルの現在と保留中のインスタン スは無視されて放棄されます。 以下のリストのシステムコール中にシグナルが補足されると、通常の場合、呼び 出しは再開されます。 SV_INTERRUPT ビットを sv_flags で設定することで、シ ステムコールは、 EINTR エラー値を伴い、途中で終了するように強制可能です。 影響を受けるシステムコールは、通信チャネルか遅いデバイス (端末などで、通 常ファイルではない) に対する read(2), write(2), sendto(2), recvfrom(2), sendmsg(2), recvmsg(2) と wait(2), ioctl(2) の途中です。しかし、すでに実 行されているシステムコールは再開されず、部分的な結果 (短い読取りカウント など) を返します。 fork(2) か vfork(2) の後では、すべてのシグナル、シグナルマスク、シグナル スタック、再開 / 割込みフラグが子に継承されます。 execve(2) システムコールは、補足されたすべてのシグナルのデフォルトアク ションを元に戻し、ユーザスタックで補足されるすべてのシグナルをリセットし ます。無視されたシグナルは無視されたまま残ります。シグナルマスクは同じ状 態のままです。システムコールに割り込むシグナルは、割込みを続けます。 |
注
vec に指定したマスクでは、 SIGKILL と SIGSTOP をブロックできません。これ は、システムが暗黙的に課す制限事項です。 4.2BSD では SV_INTERRUPT フラグを使用できないので、下位互換性が必要な場合 は使用しないでください。 |
戻り値
関数 sigvec() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。 |
エラー
以下のうち 1 つが発生すると、 sigvec() 関数はエラーとなり、新しいシグナル ハンドラは設置されません: |
[EFAULT]
vec か ovec は、プロセスに割り当てられたアドレス空間の 範囲外を指しています。 [EINVAL] [EINVAL] 関連項目 |
kill(1), kill(2), ptrace(2), sigaction(2), sigaltstack(2), sigblock(2), sigpause(2), sigprocmask(2), sigsetmask(2), sigsuspend(2), setjmp(3), siginterrupt(3), signal(3), sigsetops(3), tty(4) |
使用例
VAX−11 では、以下のようにハンドラルーチンを宣言できます。 void handler(sig, code, scp) int sig, code; struct sigcontext *scp; sig は、ハードウェアフォルトとトラップのマップ対象のシグナル番号であり、 下のように定義されます。 code 引数は、下で定義する定数、または互換性モー ドフォルトの場合は、ハードウェアが提供するコードであるパラメータです (互 換性モードフォルトは、pslに PSL_CM が設定されていることから、他の SIGILL トラップと区別されます)。 scp 引数は、 sigcontext 構造体 (<signal.h> で定 義) へのポインタで、シグナル前にコンテキストを復元するために使用されま す。 |
バグ
このマニュアルページは不明確です。 FreeBSD 10.0 April 19, 1994 FreeBSD 10.0 |