tail head cat sleep
QR code linking to this page

manページ  — SIGVEC

名称

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

システムではシグナルの集合を定義しており、 これらはプロセスに配信されることがあります。 シグナルの配信は、ハードウェア割込みの発生に似ています。 シグナルのさらなる発生はブロックされ、現在のプロセスコンテキストは 保存されて、新しいプロセスコンテキストが作成されます。 プロセスは、シグナルの配信先 handler を指定することもあれば、シグナルを ブロックすること および 無視すること を指定することもあります。 シグナルが発生した場合に、システムがデフォルトのアクションを取ることを 指定することも可能です。 通常の場合、シグナルハンドラは、プロセスの現行スタックで動作します。 これは、ハンドラ毎に変更して、シグナルが特殊な シグナルスタック でハンドルされるようにできます。

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

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

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

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

以下はすべてのシグナルのリストです。 名称は、インクルードファイル <signal.h> と同じです:
名称 Ta デフォルトアクション 説明
SIGHUP プロセスの終了 Ta 端末ラインのハングアップ
SIGINT プロセスの終了 Ta プログラムの割込み
SIGQUIT コアイメージの作成 Ta プログラムの終了
SIGILL コアイメージの作成 Ta 不正な命令
SIGTRAP コアイメージの作成 Ta トラップの追跡
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 をブロックできません。 これは、システムが暗黙的に課す制限事項です。

BSD 4.2 では 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.

エラー

以下のうち 1 つが発生すると、 sigvec() 関数はエラーとなり、新しいシグナルハンドラは設置されません:
[EFAULT]
  vecovec は、プロセスに割り当てられたアドレス空間の範囲外を指しています。
[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 構造体 <(> で定義) へのポインタで、シグナル前にコンテキストを復元するために使用されます。

バグ

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

SIGVEC (2) April 19, 1994

tail head cat sleep
QR code linking to this page


このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.

Today, the Unix equivalent of a power drill would have 20 dials and switches, come with a nonstandard plug, require the user to hand-wind the motor coil, and not accept 3/8" or 7/8" drill bits (though this would be documented in the BUGS section of its instruction manual).
— The Unix Haters' handbook