SIGVEC(2)

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

ライブラリ
libc

書式
<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) が呼び出されるまで) 設置されます。 このマスクは、現在のシグナルマスクに、配信されるシグナルを追加し、 呼び出されるハンドラに関連したシグナルマスクとの論理和を 取って形成されます。

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_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 フラグを使用できないので、下位互換性が必要な場合は使用しないでください。

戻り値

エラー
以下のうち 1 つが発生すると、 sigvec() 関数はエラーとなり、新しいシグナルハンドラは設置されません:

[EFAULT]
    vec か ovec は、プロセスに割り当てられたアドレス空間の範囲外を指しています。

[EINVAL]
    Sig 引数が、正しいシグナル番号になっていません。

[EINVAL]
    SIGKILL か SIGSTOP のハンドラを無視するか提供しようとしました。

関連項目
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> で定義) へのポインタで、シグナル前にコンテキストを復元するために使用されます。

バグ
このマニュアルページは不明確です。