スポンサーリンク

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> と同じです:

名称 デフォルトアクション 説明
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 フラグを使用できないので、下位互換性が必要な場合 は使用しないでください。

戻り値

関数 sigvec() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。

エラー

以下のうち 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 構造体 (<signal.h> で定 義) へのポインタで、シグナル前にコンテキストを復元するために使用されま す。

バグ

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

FreeBSD 10.0 April 19, 1994 FreeBSD 10.0

スポンサーリンク