SIGVEC

Section: System Calls (2)
索引 jman

BSD mandoc
 

索引

名称

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

索引

ライブラリ

Lb libc  

索引

書式

In signal.h
struct sigvec {
        void     (*sv_handler)();
        int      sv_mask;
        int      sv_flags;
};
Ft int Fn sigvec int sig struct sigvec *vec struct sigvec *ovec  

索引

解説

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

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

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

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

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

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

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

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

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

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

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

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

索引

Fa vec に指定したマスクでは、 SIGKILLSIGSTOP をブロックできません。 これは、システムが暗黙的に課す制限事項です。

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

索引

戻り値

Rv -std sigvec  

索引

エラー

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

Bq Er EFAULT
Fa vec か Fa ovec は、プロセスに割り当てられたアドレス空間の範囲外を指しています。
Bq Er EINVAL
Fa sig 引数が、正しいシグナル番号になっていません。
Bq Er EINVAL
SIGKILLSIGSTOP のハンドラを無視するか提供しようとしました。

 

索引

関連項目

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;

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

索引

バグ

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


 

索引

Index

名称
ライブラリ
書式
解説
戻り値
エラー
関連項目
使用例
バグ

jman



Time: 07:06:31 GMT, January 12, 2009