SIGNAL(3C) — NEWS-OS Programmer’s Manual
名称
signal − 簡素化されたソフトウェアシグナル機構
形式
#include <signal.h>
(∗signal(sig, func))()
int (∗func)();
解説
signal は、より一般的な sigvec(2) の機能に対し、 簡素化されたインタフェースです。
シグナルは以下のような要因による例外的な事象によって発生します。 要因としては、端末のユーザの要求 (中止、割り込み、中断)、 プログラムのエラー (バスエラーなど)、 他のプログラムの要求 (kill)、 バックグラウンドにいる間に制御端末を アクセスしようとしたためにプロセスが中断された場合 ( tty(4) 参照)などがあります。 また、プロセスを中断後に再実行した時や、 子プロセスのステータスが変化した時、 制御端末からの入力が可能になった時に、 任意にシグナルを発生させることも可能です。 ほとんどのシグナルは、 何も処理がなされなければ、 受信プロセスを終了させます。 あるシグナルは、 それを受信したプロセスを中断させるか、 あるいはプロセスが他に要求しなかったならば、 それは単純に無視されます。 SIGKILL および SIGSTOP シグナル以外については、 signal の呼び出しにより、シグナルが無視されるようにするか、 あるいはシグナルが指定位置で割り込みを生ずるようにするかの、 どちらかが可能です。 以下に、インクルードファイル <signal.h> に収められている全シグナルのリストを示します。
SIGHUP1ハングアップ
SIGINT2割り込み
SIGQUIT3∗中止
SIGILL4∗不法な命令
SIGTRAP5∗トレーストラップ
SIGIOT6∗IOT 命令
SIGEMT7∗EMT 命令
SIGFPE8∗浮動小数点の例外
SIGKILL9強制終了 (キャッチすることも無視することもできない)
SIGBUS10∗バスエラー
SIGSEGV11∗セグメンテーション違反
SIGSYS12∗システムコールに対する無効な引数
SIGPIPE13読み取りが行われていないパイプへ書き込んだ
SIGALRM14アラームクロック
SIGTERM15ソフトウェア終了シグナル
SIGURG16•ソケット上に緊急事態が存在する
SIGSTOP17†中断 (キャッチすることも無視することもできない)
SIGTSTP18†キーボードから発生した中断シグナル
SIGCONT19•中断後の継続
SIGCHLD20•子プロセスのステータスが変化した
SIGTTIN21†制御端末からバックグラウンド入力がされた
SIGTTOU22†制御端末からバックグラウンド出力がされた
SIGIO23•ディスクリプタ上での入出力が可能 (fcntl(2) 参照)
SIGXCPU24CPU タイムの制限を超過した (setrlimit(2)参照)
SIGXFSZ25ファイルサイズの制限を超過した (setrlimit(2) 参照)
SIGVTALRM26仮想タイムアラーム (setitimer(2) 参照)
SIGPROF27プロファイリングタイマアラーム (setitimer(2) 参照)
SIGWINCH28•ウィンドウサイズの変更
SIGUSR130ユーザ定義シグナル 1
SIGUSR231ユーザ定義シグナル 2
上記のリストでアスタリスク (∗) が付けられているシグナルは、 キャッチも無視もされない場合には、 コアイメージを生成します。
func が SIG_DFL のとき、 シグナル sig に対するデフォルト処理が復元されます。 デフォルトの処理は、 • または † の付けられているシグナル以外のシグナルでは、 (∗ の付けられているシグナルではコアイメージの生成と共に) 終了 です。 • の付けられているシグナルは、 処理が SIG_DFL である場合には捨てられます。 † の付けられているシグナルは、 プロセスを停止させます。 func が SIG_IGN のとき、 シグナルは続けて無視され、 シグナルのペンディング状態は放棄されます。 そうでなければ、 シグナルが発生すると、 それ以降に発生するシグナルは自動的にブロックされ、 func が呼び出されます。
関数から戻ると、処理されたシグナルのブロック状態は解除され、 プロセスは割り込まれた位置からを続行されます。 以前のシグナル機構と違い、 シグナルが送信された後も、 ハンドラ func は設定されたままです。
いくつかのシステムコールの実行中に、キャッチされるシグナルが発生した場合、 そのシステムコールは速やかに終了させられ、 そのシステムコールは自動的に再スタートされます。 特に、 これは、 wait(2) の最中と、 (ファイルではなく、 端末装置のような) 速度の遅いデバイスにおける read あるいは write(2) の最中に生じる可能性があります。
signal の値は、 各シグナルに対する以前の (または最初の) func の値です。
fork(2) あるいは vfork(2) の後では、 子は全てのシグナルを受け継ぎます。 execve(2) は、すべての受信シグナルをデフォルト処理に設定しなおします。 また、 無視されたシグナルは、 そのまま無視されます。
リターン値
正常終了すると、 以前の動作が返されます。 そうでなければ、−1 が返され、 エラーを示すために errno がセットされます。
エラー
次のうちどれかが生じた場合、 signal は失敗し、 いかなる動作も起こりません。
[EINVAL] sig が有効なシグナル番号でない。
[EINVAL] SIGKILL または SIGSTOP に対するハンドラを無視するか、 あるいは捕獲するような試行がなされた。
[EINVAL] SIGCONT を無視するような試行がなされた (デフォルトでは SIGCONT は無視される)。
関連事項
kill(1), ptrace(2), kill(2), sigblock(2), sigsetmask(2), sigpause(2), sigreturn(2), sigstack(2), sigvec(2), setjmp(3), tty(4)
注意事項 (NEWS に関して)
ハンドラルーチンは、 次のように宣言することができます。
handler(sig, code, scp)
int sig, code;
struct sigcontext ∗scp;
ここで、 sig はシグナル番号であり、 ハードウェアの例外状態が、 下記の定義に従ってシグナル番号にマップされます。 code は、下記のリストにある定数またはゼロです。 scp は、 (<signal.h> で定義されている) sigcontext 構造体へのポインタであり、 この構造体は、 シグナルが送られる前のコンテクストを 復元するために使用されます。
以下に、 ハードウェアの例外状態の シグナルとコードへのマッピングの定義を 示します。 これらの記号はすべて、 <signal.h> または <machine/cpu.h> 内で定義されています。
Hardware conditionSignalCode
整数のオーバーフローSIGFPEEXC_OV
セグメンテーション違反SIGSEGVSEXC_SEGV
不法命令SIGILLEXC_II
コプロセッサ使用不能SIGILLSEXC_CPU
データバスエラーSIGBUSEXC_DBE
命令バスエラーSIGBUSEXC_IBE
アドレスエラー (読み出し時)SIGBUSEXC_RADE
アドレスエラー (書き込み時)SIGBUSEXC_WADE
ユーザブレークポイント (デバッガが使用)SIGTRAPBRK_USERBP
遅延分岐エミュレーション (分岐)SIGTRAPBRK_BD_TAKEN
遅延分岐エミュレーション (非分岐)SIGTRAPBRK_BD_NOTTAKEN
ユーザシングルステップ (デバッガが使用)SIGTRAPBRK_SSTEPBP
オーバーフローチェックSIGTRAPBRK_OVERFLOW
0 除算チェックSIGTRAPBRK_DIVZERO
範囲エラーチェックSIGTRAPBRK_RANGE
乗算によるオーバーフローSIGTRAPBRK_MULOVF
NEWS-OSRelease 4.2.1R