330 lines
10 KiB
Groff
330 lines
10 KiB
Groff
.\" 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
|
|
.\"
|
|
.\" 2001/01/01 horikawa@jp.FreeBSD.org
|
|
.\" sigvec.2 を更新する場合は、共通部分の多い sigaction.2 も同時に更新
|
|
.\" してください。
|
|
.\"
|
|
.Dd April 19, 1994
|
|
.Dt SIGVEC 2
|
|
.Os BSD 4
|
|
.Sh 名称
|
|
.Nm sigvec
|
|
.Nd ソフトウェアシグナル機能
|
|
.Sh 書式
|
|
.Fd #include <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
|
|
このインタフェースは、
|
|
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
|
|
が呼び出されるまで) 設置されます。
|
|
このマスクは、現在のシグナルマスクに、配信されるシグナルを追加し、
|
|
呼び出されるハンドラに関連したシグナルマスクとの論理和を
|
|
取って形成されます。
|
|
.Pp
|
|
.Fn sigvec
|
|
は、特定のシグナルにハンドラを割り当てます。
|
|
.Fa vec
|
|
を 0 以外にした場合は、指定したシグナルを配信する場合に使用する
|
|
ハンドラルーチンとマスクが指定されます。
|
|
.Dv SV_ONSTACK
|
|
ビットが
|
|
.Fa sv_flags
|
|
で設定されている場合、システムは、
|
|
.Xr sigaltstack 2
|
|
で指定された
|
|
.Em シグナルスタック
|
|
のプロセスにシグナルを配信します。
|
|
.Fa ovec
|
|
を 0 以外にした場合は、
|
|
シグナルの前の処理情報がユーザに返されます。
|
|
.Pp
|
|
以下はすべてのシグナルのリストです。
|
|
名称は、インクルードファイル
|
|
.Aq Pa 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 " コアイメージの作成" 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
|
|
で設定することで、システムコールは、
|
|
.Dv 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
|
|
フラグを使用できないので、下位
|
|
互換性が必要な場合は使用しないでください。
|
|
.Pp
|
|
.Sh 戻り値
|
|
0 は、呼び出しに問題がなかったことを表わします。
|
|
-1 は、エラーが発生し、
|
|
.Va errno
|
|
がエラーの理由を示すように設定されていることを表わします。
|
|
.Pp
|
|
.Sh エラー
|
|
以下のうち 1 つが発生すると、
|
|
.Fn sigvec
|
|
はエラーとなり、新
|
|
しいシグナルハンドラは設置されません。
|
|
.Bl -tag -width [EINVAL]
|
|
.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
|
|
構造体 (
|
|
.Aq Pa signal.h
|
|
で定義) へのポインタで、シグナル前にコンテキストを復元するために使用されます。
|
|
.Sh バグ
|
|
このマニュアルページは不明確です。
|