sigvec(2) FreeBSD 一般コマンドマニュアル

sigvec

前のページ 上に戻る 次のページ

sigvec




書式

     #include <signal.h>
     struct sigvec {
             void     (*sv_handler)();
             int      sv_mask;
             int      sv_flags;
     };

     int
     sigvec(int sig, struct sigvec *vec, struct sigvec *ovec);


解説

     B>こB>のB>イB>ンB>タB>フB>ェB>ーB>スB>はB>、 sigaction(2) B>にB>置B>きB>換B>えB>らB>れB>まB>しB>たB>。

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

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

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

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

     sigvec() は、特定のシグナルにハンドラを割り当てます。 vec を 0 以外にした
     場合は、指定したシグナルを配信する場合に使用するハンドラルーチンとマスク
     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) の途中です。しかし、すでに実

     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 4.4                     April 19, 1994                     FreeBSD 4.4

ABELNET VPSサービス