EN JA
SIGVEC(2)
SIGVEC(2) FreeBSD System Calls Manual SIGVEC(2)

名称

sigvecソフトウェアシグナル機能

ライブラリ

Standard C Library (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) に置き換えられました。

システムは、プロセスに配信される 1 組のシグナルを定義しています。シグナルの配信は、ハードウェア割り込みの発生に似ています: シグナルは、さらなる発生はブロックされ、現在のプロセスのコンテキストは、保存され、新しいものが、構築されます。プロセスは、シグナルが配信される handler (ハンドラ) を指定するか、またはシグナルが ブロック されるか、または 無視 されることを指定します。また、プロセスは、デフォルトのアクションがシグナルが発生するとき、システムによって取られることを指定します。通常、シグナルハンドラは、プロセスの現在のスタックで実行します。これは、ハンドラ単位で、変更され、その結果、シグナルは、特別の シグナルスタック に取られます。

すべてのシグナルの 優先順位 は同じです。シグナルルーチンは、呼び出しの原因となったシグナルが ブロックされた 状態で動作しますが、その他のシグナルが発生する可能性はあります。グローバルな シグナルマスク には、プロセスへの配信が現在ブロックされているシグナルの集合が定義されています。プロセスのシグナルマスクは、親のシグナルマスクに初期化されます (通常は 0)。シグナルマスクは、 sigblock(2)sigsetmask(2) を呼び出すか、シグナルがプロセスに配信された場合に変更され得ます。

シグナル条件がプロセスで発生すると、そのシグナルが、プロセスで保留になっているシグナルの集合に追加されます。そのシグナルがプロセスで現在 ブロック されていない場合は、プロセスに配信されます。シグナルが配信されると、プロセスの現在の状態が保存され、新しいシグナルマスクが以下で説明するように算出されて、シグナルハンドラが呼び出されます。ハンドラの呼び出しは、シグナル処理ルーチンが正常に戻った場合にプロセスがシグナル配信前のコンテキストで実行を再開するように編成されます。プロセスが別のコンテキストでの再開を望む場合は、プロセスが前のコンテキストそのものを回復するように編成する必要があります。

シグナルがプロセスに配信されると、新しいシグナルマスクが、プロセスのシグナルハンドラが続く間 (または sigblock(2)sigsetmask(2) が呼び出されるまで) 設置されます。このマスクは、現在のシグナルマスクに、配信されるシグナルを追加し、呼び出されるハンドラに関連したシグナルマスクとの論理和 ( or) を取って形成されます。

sigvec() 関数は、特定のシグナルにハンドラを割り当てます。 vec を 0 以外にした場合は、指定したシグナルを配信する場合に使用するハンドラルーチンとマスクが指定されます。 SV_ONSTACK ビットが sv_flags で設定されている場合、システムは、 sigaltstack(2) で指定された シグナルスタック のプロセスにシグナルを配信します。 ovec を 0 以外にした場合は、シグナルの前の処理情報がユーザに返されます。

以下はすべてのシグナルのリストです。名称は、インクルードファイル < signal.h> と同じです:

名称 デフォルトアクション 説明
SIGHUP プロセスの終了 端末ラインのハングアップ
SIGINT プロセスの終了 プログラムの割込み
SIGQUIT コアイメージの作成 プログラムの終了
SIGILL コアイメージの作成 不正な命令
SIGTRAP コアイメージの作成 トラップの追跡
SIGABRT コアイメージの作成 abort(3) の呼び出し (以前の SIGIOT)
SIGEMT コアイメージの作成 実行した命令のエミュレート
SIGFPE コアイメージの作成 浮動小数例外
SIGKILL プロセスの終了 プログラムの終了
SIGBUS コアイメージの作成 バスエラー
SIGSEGV コアイメージの作成 セグメンテーション違反
SIGSYS コアイメージの作成 存在しないシステムコールの呼び出し
SIGPIPE プロセスの終了 読み込み側のないパイプでの書み込み
SIGALRM プロセスの終了 リアルタイムタイマの満了
SIGTERM プロセスの終了 ソフトウェア終了シグナル
SIGURG シグナルの放棄 緊急事態がソケットに存在
SIGSTOP プロセスの停止 停止 (補足も無視もできません)
SIGTSTP プロセスの停止 キーボードから生成された停止シグナル
SIGCONT シグナルの放棄 停止後の継続
SIGCHLD シグナルの放棄 子ステータスの変化
SIGTTIN プロセスの停止 制御端末からバックグラウンド読み込もうとした
SIGTTOU プロセスの停止 制御端末にバックグラウンド書き込もうとした
SIGIO シグナルの放棄 記述子に I/O 可能 ( fcntl(2) 参照)
SIGXCPU プロセスの終了 cpu 制限時間の超過 ( setrlimit(2) 参照)
SIGXFSZ プロセスの終了 ファイルサイズ制限の超過 ( setrlimit(2) 参照)
SIGVTALRM プロセスの終了 仮想時間アラーム ( setitimer(2) 参照)
SIGPROF プロセスの終了 プロファイリングタイマアラーム ( setitimer(2) 参照)
SIGWINCH シグナルの放棄 ウィンドウサイズの変化
SIGINFO シグナルの放棄 キーボードからのステータス要求
SIGUSR1 プロセスの終了 ユーザ定義シグナル 1
SIGUSR2 プロセスの終了 ユーザ定義シグナル 2

シグナルハンドラが設置されると、 sigvec() を再度呼び出すか execve(2) を実行するまでシグナルハンドラは設置されたまま残ります。シグナルに固有なデフォルトアクションへは、 sv_handlerSIG_DFL に設定することでリセットできます。デフォルトは、プロセスの終了 (コアダンプが取られることもあります)、アクションなし、プロセスの停止、プロセスの継続です。それぞれのシグナルのデフォルトアクションについては、上のシグナルリストを参照してください。 sv_handlerSIG_IGN である場合、シグナルの現在と保留中のインスタンスは無視されて放棄されます。

以下のリストのシステムコール中にシグナルが補足されると、通常の場合、呼び出しは再開されます。 SV_INTERRUPT ビットを sv_flags で設定することで、システムコールは、 EINTR エラー値を伴い、途中で終了するように強制可能です。影響を受けるシステムコールは、通信チャネルまたは (通常ファイルではなく端末のような) 遅いデバイスと wait(2) または ioctl(2) の間で read(2), write(2), sendto(2), recvfrom(2), sendmsg(2)recvmsg(2) を含んでいます。しかし、すでに実行されているシステムコールは再開されず、部分的な結果 (短い読み込みカウントなど) を返します。

fork(2)vfork(2) の後では、すべてのシグナル、シグナルマスク、シグナルスタック、再開 / 割込みフラグが子に継承されます。

execve(2) システムコールは、補足されたすべてのシグナルのデフォルトアクションを元に戻し、ユーザスタックで補足されるすべてのシグナルをリセットします。無視されたシグナルは無視されたまま残ります。シグナルマスクは同じ状態のままです。システムコールに割り込むシグナルは、割込みを続けます。

vec マスクは、 SIGKILL または SIGSTOP をブロックすることを許可しません。これは、システムによって静かに無視されます。

4.2BSD では SV_INTERRUPT フラグを使用できないので、下位互換性が必要な場合は使用しないでください。

戻り値

The sigvec() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

使用例

VAX-11 では、以下のようにハンドラルーチンを宣言できます。

void handler(sig, code, scp) 
int sig, code; 
struct sigcontext *scp;

sig は、ハードウェアフォルトとトラップのマップ対象のシグナル番号であり、下のように定義されます。 code 引数は、下で定義する定数、または互換性モードフォルトの場合は、ハードウェアが提供するコードであるパラメータです (互換性モードフォルトは、pslに PSL_CM が設定されていることから、他の SIGILL トラップと区別されます)。 scp 引数は、 sigcontext 構造体 ( < signal.h> で定義) へのポインタで、シグナル前にコンテキストを復元するために使用されます。

エラー

以下のうち 1 つが発生すると、 sigvec() 関数はエラーとなり、新しいシグナルハンドラは設置されません:
[ EFAULT]
vecovec は、プロセスに割り当てられたアドレス空間の範囲外を指しています。
[ EINVAL]
sig 引数が、正しいシグナル番号になっていません。
[ EINVAL]
SIGKILLSIGSTOP のハンドラを無視するか提供しようとしました。

バグ

このマニュアルページは、まだ混乱しています。
April 19, 1994 FreeBSD