| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 2 : システムコール > ssignal(2)HP-UX 11i Version 2: September 2004 |
|
名称signal, sigset, sighold, sigrelse, sigignore, sigpause ― シグナル管理 構文#include <signal.h> void (*signal(int sig, void (*func)(int)))(int); int sighold(int sig); int sigignore(int sig); int sigpause(int sig); int sigrelse(int sig); void (*sigset(int sig, void (*disp)(int)))(int); 説明signal() 関数は、シグナル番号 sig の受け取りを処理する 3 つの方法から 1 つを選択します。func の値が SIG_DFL の場合、そのシグナルに対するデフォルト処理を行ないます。 func の値が SIG_IGN の場合、シグナルは無視されます。それ以外の場合は、 func はシグナルが発生したときに呼び出す関数を指していなければなりません。このような関数はシグナルハンドラーと呼ばれます。 シグナルが発生したときに、 func が関数を指している場合、最初に、 signal(sig, SIG_DFL); と同等のものが実行されるか、または、そのシグナルのインプリメンテーションに依存するブロックが行われます。 sig の値が SIGILL の場合は、 SIG_DFL に対するリセットか生じるか否かはインプリメンテーションに依存します。 次に、 (*func)(sig); と同等なものが実行されます。 func 関数は、リターン文の実行または abort()、 exit() または longjmp() の呼び出しによって終了します。 func() がリターン文を実行し、 sig の値が SIGFPE またはインプリメンテーション依存の、計算の例外に対応する値の場合、動作は保証されません。そうでない場合は、プログラムは、割り込みがあった位置から再度実行します。 abort()、 kill() または、 raise() の結果としてではなく、シグナルが 発生した場合は、シグナルハンドラーが sigaction() ページにリストされた関数以外の標準ライブラリの関数を呼び出すか、 あるいは、揮発性の sig_atomic_t 型の静的記憶継続時間変数 に値を割り当てないで静的記憶継続時間を用いているオブジェクトを参照するときには、動作は保証されません。 さらにそのような呼び出しが失敗した場合は、 errno の値は確定されません。 プログラムの開始時に、シグナルに対して、次の signal(sig, SIG_IGN); と同等のものがいくつかのシグナルに対して実行されます。 また、他のすべてのシグナルに対して、次の signal(sig, SIG_DFL); と同等のものが実行されます (exec 参照)。 sigset()、 sighold()、 sigignore()、 sigpause() および segrelse() 関数によりシグナル管理が簡略化できます。 sigset() 関数を使用して、シグナル処理を変更できます。 引き数 sig には SIGKILL および SIGSTOP 以外のシグナルを指定します。 引き数 disp にはシグナルの処理として、 SIG_DFL、 SIG_IGN、 またはシグナルハンドラーのアドレスを指定します。 sigset() が使用され、 disp がシグナルハンドラーのアドレスの場合、システムは、シグナルハンドラーの実行前に、 sig を呼び出しプロセスのシグナルマスクに追加します。 シグナルハンドラーが復帰するとき、システムは呼び出しプロセスのシグナルマスクをシグナルの送信前の状態に戻します。さらに、 sigset() が使用され、 disp が SIG_HOLD に等しい場合、 sig は呼び出しプロセスのシグナルマスクに追加され、 sig の処理は変更されません。 sigset() が使用され、 disp が SIG_HOLD と等しくない場合、 sig は呼び出しプロセスのシグナルマスクから削除されます。 sighold() 関数は sig を呼び出しプロセスのシグナルマスクに追加します。 sigrelse() 関数は sig を呼び出しプロセスのシグナルマスクから削除します。 sigignore() 関数は sig の処理として SIG_IGN をセットします。 sigpause() 関数は sig を呼び出しプロセスのシグナルマスクから削除し、シグナルが受信されるまで、呼び出しプロセスを保留します。 SIGCHLD シグナルに対するアクションが SIG_IGN として設定された場合、呼び出しプロセスの子プロセスは、その終了時にゾンビプロセスに変換されません。 呼び出し側のプロセスがその子プロセスを待ったときに、 ゾンビプロセスに変換され、まだ待たれていない子プロセスがない場合、 呼び出し側のプロセスはすべての子プロセスが終了するまでブロックし、 wait()、 wait3()、 waitid() および waitpid() は失敗し、 errno を ECHILD にセットします。 戻り値要求が受入れられた場合は、 signal() は、 指定したシグナル sig に対する signal() の最新の呼び出しに対応する func() の値を返します。 そうでない場合は、 SIG_ERR が返され、正の値が errno に格納されます。 正常終了の場合、 sigset() は、シグナルがブロックされている場合は、 SIG_HOLD を返し、シグナルがブロックされていない場合は、シグナルの以前の処理を返します。失敗の場合は、 SIG_ERR を返し、 errno に、エラーの種類を示す値をセットします。 他のすべての関数では、正常終了の場合は 0 が返されます。失敗の場合は\(mi1 が返され、 errno に、エラーの種類を示す値がセットされます。 エラーsignal() は次の場合に失敗します。
signal() は次の場合に失敗することがあります。
sigset()、 sighold()、 sigrelse()、 sigignore()、 および sigpause() は次の場合に失敗します。
sigset() および sigignore() は次の場合に失敗します。
アプリケーション使用法sigaction() 関数を使用すると、より包括的かつ確実にシグナルの制御ができます。新しいアプリケーションは signal() ではなく、 sigaction() を使用するべきです。 sighold() 関数は、 sigrelse() または sigpause() とともに、シグナル送信の一時的延期を要求するコードのクリティカル領域を作成するために使用されます。 sigsuspend() 関数は sigpause() により移植性を持たせる場合に使用します。 スレッドについての留意事項signal() で設定されたシグナル受信時の動作 (捕捉無視デフォルトなど) は、プロセス内のすべてのスレッドで共有されます。ブロックされているシグナルマスクは、各スレッドごとに管理されます。 デフォルトの動作がシグナルを無視するようになっているシグナル sig のシグナル受信時動作を、 signal() 関数で SIG_IGN または SIG_DFL に設定すると、 プロセスとすべてのスレッドで保留されている sig のインスタンスが破棄されます。シグナルがスレッドでブロックされているかどうかにかかわらず、シグナルは破棄されます。 シグナルとスレッドの詳細については、 signal(5) を参照してください。 第 4 刷ISO C 標準のデータの整列型式に準拠するために次の変更が行われました。
その他の変更は次のとおりです。
第 4 刷バージョン 2X/OPEN UNIX に準拠するように以下の変更が行われました。
HP-UX 拡張 構文void (*signal(int sig, void (*action)(int)))(int); void (*sigset(int sig, void (*func)(int)))(int); 説明システムは、プロセスに送信できるシグナルの集合を定義しています。 シグナルの集合は、各シグナルの意味と副作用とともに signal(5) で定義されています。 これらのシグナルを処理する代替の機構がここで定義されています。 ここで説明する機能は、 signal(2)、 sigvector(2)、 sigblock(2)、 sigsetmask(2)、 sigpause(3C)、 および sigspace(2) で記述されている他の機能とともに使用しないでください。 sig に受入れ可能な値は <signal.h> で定義されています。
sigset() によって、呼び出しプロセスは、 特定のシグナルの受信を扱う 4 通りの方法から 1 つを選べます。 sig はシグナルを指定し、 func は選択を指定します。
sighold() は、シグナル sig をホールドします。 sigrelse() は、 sig に対するシステムのシグナルアクションを、 以前に sigset() で指定されていたものに戻します。 sighold() および sigrelse() は、クリティカル領域のコードを確立するために使われます。 sighold() は、優先順位のレベルを上げ、 sigrelse() によって優先順位が下げられるまで シグナルを延期したり、ホールドしたりします。 sigignore() は、シグナル sig に対する動作を SIG_IGN にセットします。 ( signal(5) 参照)。 sigpause() は、ブロックされていないシグナルを受け取るまで、呼び出しプロセスを 停止させます。 シグナル sig がホールドされていると、 プロセスが停止する前に解放されます。 sigpause() は、シグナルが発生したとき変更される変数をテストするのに便利です。 たとえば、 まず sighold() を使ってシグナルをブロックし、ついで変数をテストします。 変数が変更されていなければ、 sigpause() を呼び出してシグナルを待ちます。 これらの関数は、 ld コマンドに -lV3 オプションを与えて、プログラムにリンクできます ( ld(1) 参照)。 エラーsigset() は、次の場合に失敗し、 sig に対するシステムのシグナルアクションは変更されません。
sigset()、 sighold()、 sigrelse()、 sigignore()、 および sigpause() は、次の場合に失敗し、 sig に対するシステムのシグナルアクションは変更されません。
sigpause は、次の場合に戻ります。
例次の signal() の呼び出しは、 SIGINT シグナルに対してシグナル捕捉関数を設定します。 void myhandler(); 警告signal() を、 bsdproc(3C)、 sigaction(2)、 sigset(3C)、 sigvector(2) で述べた機能と組み合わせて使用しないでください。 signal() は action の不当な値を検出しません。 action の値が SIG_DFL や SIG_IGN と等しくなく、 有効な関数のアドレスを指していない場合、次に シグナル sig を受け取った時の動作は保証されません。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||