.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)sigvec.2 8.2 (Berkeley) 4/19/94 .\" %FreeBSD: src/lib/libc/compat-43/sigvec.2,v 1.24 2004/07/02 23:52:09 ru Exp % .\" .\" 2001/01/01 horikawa@jp.FreeBSD.org .\" sigvec.2 を更新する場合は、共通部分の多い sigaction.2 も同時に更新 .\" してください。 .\" .\" $FreeBSD$ .Dd April 19, 1994 .Dt SIGVEC 2 .Os .Sh 名称 .Nm sigvec .Nd ソフトウェアシグナル機能 .Sh ライブラリ .Lb libc .Sh 書式 .In signal.h .Bd -literal struct sigvec { void (*sv_handler)(); int sv_mask; int sv_flags; }; .Ed .Ft int .Fn sigvec "int sig" "struct sigvec *vec" "struct sigvec *ovec" .Sh 解説 .Bf -symbolic このインタフェースは、 .Xr sigaction 2 に置き換えられました。 .Ef .Pp システムではシグナルの集合を定義しており、 これらはプロセスに配信されることがあります。 シグナルの配信は、ハードウェア割込みの発生に似ています。 シグナルのさらなる発生はブロックされ、現在のプロセスコンテキストは 保存されて、新しいプロセスコンテキストが作成されます。 プロセスは、シグナルの配信先 .Em handler を指定することもあれば、シグナルを .Em ブロックすること および .Em 無視すること を指定することもあります。 シグナルが発生した場合に、システムがデフォルトのアクションを取ることを 指定することも可能です。 通常の場合、シグナルハンドラは、プロセスの現行スタックで動作します。 これは、ハンドラ毎に変更して、シグナルが特殊な .Em シグナルスタック でハンドルされるようにできます。 .Pp すべてのシグナルの .Em 優先順位 は同じです。 シグナルルーチンは、呼び出しの原因となったシグナルが .Em ブロックされた 状態で動作しますが、その他のシグナルが発生する可能性はあります。 グローバルな .Em シグナルマスク には、プロセスへの配信が現在ブロックされているシグナルの集合が 定義されています。 プロセスのシグナルマスクは、親のシグナルマスクに初期化されます (通常は 0)。 シグナルマスクは、 .Xr sigblock 2 か .Xr sigsetmask 2 を呼び出すか、シグナルがプロセスに配信された場合に変更され得ます。 .Pp シグナル条件がプロセスで発生すると、そのシグナルが、 プロセスで保留になっているシグナルの集合に追加されます。 そのシグナルがプロセスで現在 .Em ブロック されていない場合は、プロセスに配信されます。 シグナルが配信されると、プロセスの現在の状態が保存され、 新しいシグナルマスクが以下で説明するように 算出されて、シグナルハンドラが呼び出されます。 ハンドラの呼び出しは、シグナル処理ルーチンが正常に戻った場合に プロセスがシグナル配信前のコンテキストで実行を再開するように編成されます。 プロセスが別のコンテキストでの再開を望む場合は、 プロセスが前のコンテキストそのものを回復するように編成する必要があります。 .Pp シグナルがプロセスに配信されると、新しいシグナルマスクが、 プロセスのシグナルハンドラが続く間 (または .Xr sigblock 2 か .Xr sigsetmask 2 が呼び出されるまで) 設置されます。 このマスクは、現在のシグナルマスクに、配信されるシグナルを追加し、 呼び出されるハンドラに関連したシグナルマスクとの論理和 .Em ( or ) を取って形成されます。 .Pp .Fn sigvec 関数は、特定のシグナルにハンドラを割り当てます。 .Fa vec を 0 以外にした場合は、指定したシグナルを配信する場合に使用する ハンドラルーチンとマスクが指定されます。 .Dv SV_ONSTACK ビットが .Fa sv_flags で設定されている場合、システムは、 .Xr sigaltstack 2 で指定された .Em シグナルスタック のプロセスにシグナルを配信します。 .Fa ovec を 0 以外にした場合は、シグナルの前の処理情報がユーザに返されます。 .Pp 以下はすべてのシグナルのリストです。 名称は、インクルードファイル .In signal.h と同じです: .Bl -column SIGVTALARMXX "create core imagexxx" .It Sy "名称 デフォルトアクション 説明" .It Dv SIGHUP No " プロセスの終了" " 端末ラインのハングアップ" .It Dv SIGINT No " プロセスの終了" " プログラムの割込み" .It Dv SIGQUIT No " コアイメージの作成" " プログラムの終了" .It Dv SIGILL No " コアイメージの作成" " 不正な命令" .It Dv SIGTRAP No " コアイメージの作成" " トラップの追跡" .It Dv SIGABRT No " コアイメージの作成" Ta Xr abort 3 の呼び出し (以前の .Dv SIGIOT ) .It Dv SIGEMT No " コアイメージの作成" " 実行した命令のエミュレート" .It Dv SIGFPE No " コアイメージの作成" " 浮動小数例外" .It Dv SIGKILL No " プロセスの終了" " プログラムの終了" .It Dv SIGBUS No " コアイメージの作成" " バスエラー" .It Dv SIGSEGV No " コアイメージの作成" " セグメンテーション違反" .It Dv SIGSYS No " コアイメージの作成" " 存在しないシステムコールの呼び出し" .It Dv SIGPIPE No " プロセスの終了" " 読取り側のないパイプでの書込み" .It Dv SIGALRM No " プロセスの終了" " リアルタイムタイマの満了" .It Dv SIGTERM No " プロセスの終了" " ソフトウェア終了シグナル" .It Dv SIGURG No " シグナルの放棄" " 緊急事態がソケットに存在" .It Dv SIGSTOP No " プロセスの停止" " 停止 (補足も無視もできません) .It Dv SIGTSTP No " プロセスの停止" " キーボードから生成された停止シグナル" .It Dv SIGCONT No " シグナルの放棄" " 停止後の継続" .It Dv SIGCHLD No " シグナルの放棄" " 子ステータスの変化" .It Dv SIGTTIN No " プロセスの停止" " 制御端末からバックグラウンド読み取ろうとした" .It Dv SIGTTOU No " プロセスの停止" " 制御端末にバックグラウンド書き込もうとした" .It Dv SIGIO No " シグナルの放棄" " 記述子に" Tn "I/O" 可能 .Xr ( fcntl 2 参照) .It Dv SIGXCPU No " プロセスの終了" " cpu 制限時間の超過" .Xr ( setrlimit 2 参照) .It Dv SIGXFSZ No " プロセスの終了" " ファイルサイズ制限の超過" .Xr ( setrlimit 2 参照) .It Dv SIGVTALRM No " プロセスの終了" " 仮想時間アラーム" .Xr ( setitimer 2 参照) .It Dv SIGPROF No " プロセスの終了" " プロファイリングタイマアラーム" .Xr ( setitimer 2 参照) .It Dv SIGWINCH No " シグナルの放棄" " ウィンドウサイズの変化" .It Dv SIGINFO No " シグナルの放棄" " キーボードからのステータス要求" .It Dv SIGUSR1 No " プロセスの終了" " ユーザ定義シグナル 1" .It Dv SIGUSR2 No " プロセスの終了" " ユーザ定義シグナル 2" .El .Pp シグナルハンドラが設置されると、 .Fn sigvec を再度呼び出すか .Xr execve 2 を実行するまでシグナルハンドラは設置されたまま残ります。 シグナルに固有なデフォルトアクションへは、 .Fa sv_handler を .Dv SIG_DFL に設定することでリセットできます。 デフォルトは、プロセスの終了 (コアダンプが取られることもあります)、 アクションなし、プロセスの停止、プロセスの継続です。 それぞれのシグナルのデフォルトアクションについては、 上のシグナルリストを参照してください。 .Fa sv_handler が .Dv SIG_IGN である場合、シグナルの現在と保留中のインスタンスは無視されて放棄されます。 .Pp 以下のリストのシステムコール中にシグナルが補足されると、 通常の場合、呼び出しは再開されます。 .Dv SV_INTERRUPT ビットを .Fa sv_flags で設定することで、システムコールは、 .Er EINTR エラー値を伴い、途中で終了するように強制可能です。 影響を受けるシステムコールは、 通信チャネルか遅いデバイス (端末などで、通常ファイルではない) に対する .Xr read 2 , .Xr write 2 , .Xr sendto 2 , .Xr recvfrom 2 , .Xr sendmsg 2 , .Xr recvmsg 2 と .Xr wait 2 , .Xr ioctl 2 の途中です。 しかし、すでに実行されているシステムコールは再開されず、 部分的な結果 (短い読取りカウントなど) を返します。 .Pp .Xr fork 2 か .Xr vfork 2 の後では、すべてのシグナル、シグナルマスク、シグナルスタック、 再開 / 割込みフラグが子に継承されます。 .Pp .Xr execve 2 システムコールは、補足されたすべてのシグナルのデフォルトアクションを元に戻し、 ユーザスタックで補足されるすべてのシグナルをリセットします。 無視されたシグナルは無視されたまま残ります。 シグナルマスクは同じ状態のままです。 システムコールに割り込むシグナルは、割込みを続けます。 .Sh 注 .Fa vec に指定したマスクでは、 .Dv SIGKILL と .Dv SIGSTOP をブロックできません。 これは、システムが暗黙的に課す制限事項です。 .Pp .Bx 4.2 では .Dv SV_INTERRUPT フラグを使用できないので、下位互換性が必要な場合は使用しないでください。 .Sh 戻り値 .Rv -std sigvec .Sh エラー 以下のうち 1 つが発生すると、 .Fn sigvec 関数はエラーとなり、新しいシグナルハンドラは設置されません: .Bl -tag -width Er .It Bq Er EFAULT .Fa vec か .Fa ovec は、プロセスに割り当てられたアドレス空間の範囲外を指しています。 .It Bq Er EINVAL .Fa sig 引数が、正しいシグナル番号になっていません。 .It Bq Er EINVAL .Dv SIGKILL か .Dv SIGSTOP のハンドラを無視するか提供しようとしました。 .El .Sh 関連項目 .Xr kill 1 , .Xr kill 2 , .Xr ptrace 2 , .Xr sigaction 2 , .Xr sigaltstack 2 , .Xr sigblock 2 , .Xr sigpause 2 , .Xr sigprocmask 2 , .Xr sigsetmask 2 , .Xr sigsuspend 2 , .Xr setjmp 3 , .Xr siginterrupt 3 , .Xr signal 3 , .Xr sigsetops 3 , .Xr tty 4 .Sh 使用例 .Tn VAX\-11 では、以下のようにハンドラルーチンを宣言できます。 .Bd -literal -offset indent void handler(sig, code, scp) int sig, code; struct sigcontext *scp; .Ed .Pp .Fa sig は、ハードウェアフォルトとトラップのマップ対象のシグナル番号であり、 下のように定義されます。 .Fa code 引数は、下で定義する定数、または互換性モードフォルトの場合は、 ハードウェアが提供するコードであるパラメータです (互換性モードフォルトは、pslに .Dv PSL_CM が設定されていることから、他の .Dv SIGILL トラップと区別されます)。 .Fa scp 引数は、 .Fa sigcontext 構造体 .In ( signal.h で定義) へのポインタで、シグナル前にコンテキストを復元するために使用されます。 .Sh バグ このマニュアルページは不明確です。