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> 内で定義されています。
Hardware conditionSignalCode
算術演算例外:
ゼロ除算SIGFPEFPE_ZERODIV_TRAP
CHK/CHK2 命令SIGFPEFPE_CHK_TRAP
cpTRAPcc,TRAPcc,TRAPV 命令SIGFPEFPE_TRAPV_TRAP
FPCP 比較不能状態での分岐/セットSIGFPEFPE_UNORDERED_TRAP
FPCP 不正確な結果SIGFPEFPE_INEXACT_TRAP
FPCP ゼロ除算SIGFPEFPE_DIVZERO_TRAP
FPCP アンダフローSIGFPEFPE_UNDERFLOW_TRAP
FPCP オペランドエラーSIGFPEFPE_OPERAND_TRAP
FPCP オーバフローSIGFPEFPE_OVERFLOW_TRAP
FPCP シグナリング非数(SNAN)SIGFPEFPE_SNAN_TRAP
不法命令:
アドレスエラーSIGILLILL_ADDRESS_FAULT
不法命令SIGILLILL_ILLEGAL_FAULT
特権命令の実行SIGILLILL_PRIVILEGE_FAULT
コプロセッサプロトコル違反SIGILLILL_PROTOCOL_FAULT
フォーマットエラーSIGILLILL_FORMAT_FAULT
trap #n 命令(1 <= n <= 15)SIGILLILL_TRAPn_FAULT
MMU 設定エラーSIGILLILL_MMU_FAULT
予約命令:
A 列命令SIGEMTEMT_LINE1010_TRAP
F 列命令SIGEMTEMT_LINE1111_TRAP
セグメンテーション違反SIGSEGV違反したアドレス
プロテクション違反SIGBUS違反したアドレス
トレーストラップSIGTRAP
特別な不法命令(0x4afc)SIGTRAP
NEWS-OSRelease 4.1C