本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 2 : システムコール > s

signal(2)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

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_DFLSIG_IGN、 またはシグナルハンドラーのアドレスを指定します。 sigset() が使用され、 disp がシグナルハンドラーのアドレスの場合、システムは、シグナルハンドラーの実行前に、 sig を呼び出しプロセスのシグナルマスクに追加します。 シグナルハンドラーが復帰するとき、システムは呼び出しプロセスのシグナルマスクをシグナルの送信前の状態に戻します。さらに、 sigset() が使用され、 dispSIG_HOLD に等しい場合、 sig は呼び出しプロセスのシグナルマスクに追加され、 sig の処理は変更されません。 sigset() が使用され、 dispSIG_HOLD と等しくない場合、 sig は呼び出しプロセスのシグナルマスクから削除されます。

sighold() 関数は sig を呼び出しプロセスのシグナルマスクに追加します。

sigrelse() 関数は sig を呼び出しプロセスのシグナルマスクから削除します。

sigignore() 関数は sig の処理として SIG_IGN をセットします。

sigpause() 関数は sig を呼び出しプロセスのシグナルマスクから削除し、シグナルが受信されるまで、呼び出しプロセスを保留します。

SIGCHLD シグナルに対するアクションが SIG_IGN として設定された場合、呼び出しプロセスの子プロセスは、その終了時にゾンビプロセスに変換されません。 呼び出し側のプロセスがその子プロセスを待ったときに、 ゾンビプロセスに変換され、まだ待たれていない子プロセスがない場合、 呼び出し側のプロセスはすべての子プロセスが終了するまでブロックし、 wait()wait3()waitid() および waitpid() は失敗し、 errnoECHILD にセットします。

戻り値

要求が受入れられた場合は、 signal() は、 指定したシグナル sig に対する signal() の最新の呼び出しに対応する func() の値を返します。 そうでない場合は、 SIG_ERR が返され、正の値が errno に格納されます。

正常終了の場合、 sigset() は、シグナルがブロックされている場合は、 SIG_HOLD を返し、シグナルがブロックされていない場合は、シグナルの以前の処理を返します。失敗の場合は、 SIG_ERR を返し、 errno に、エラーの種類を示す値をセットします。

他のすべての関数では、正常終了の場合は 0 が返されます。失敗の場合は\(mi1 が返され、 errno に、エラーの種類を示す値がセットされます。

エラー

signal() は次の場合に失敗します。

[EINVAL] 

引き数 sig が有効なシグナル番号ではない場合、捕捉できないシグナルを捕捉しようとした場合、または、無視できないシグナルを無視しようとした場合。

signal() は次の場合に失敗することがあります。

[EINVAL]  

捕捉または無視 (または両方とも) できないシグナルに対して、アクションを SIG_DFL にセットしようとした場合。

sigset()sighold()sigrelse()sigignore()、 および sigpause() は次の場合に失敗します。

[EINVAL] 

引き数 sig が不当なシグナル番号の場合。

sigset() および sigignore() は次の場合に失敗します。

[EINVAL]  

捕捉できないシグナルを捕捉しようとした場合、または、無視できないシグナルを無視しようとした場合。

アプリケーション使用法

sigaction() 関数を使用すると、より包括的かつ確実にシグナルの制御ができます。新しいアプリケーションは signal() ではなく、 sigaction() を使用するべきです。

sighold() 関数は、 sigrelse() または sigpause() とともに、シグナル送信の一時的延期を要求するコードのクリティカル領域を作成するために使用されます。

sigsuspend() 関数は sigpause() により移植性を持たせる場合に使用します。

スレッドについての留意事項

signal() で設定されたシグナル受信時の動作 (捕捉無視デフォルトなど) は、プロセス内のすべてのスレッドで共有されます。ブロックされているシグナルマスクは、各スレッドごとに管理されます。

デフォルトの動作がシグナルを無視するようになっているシグナル sig のシグナル受信時動作を、 signal() 関数で SIG_IGN または SIG_DFL に設定すると、 プロセスとすべてのスレッドで保留されている sig のインスタンスが破棄されます。シグナルがスレッドでブロックされているかどうかにかかわらず、シグナルは破棄されます。

シグナルとスレッドの詳細については、 signal(5) を参照してください。

参照

exec(2), pause(2), sigaction(2), waitid(2), <signal.h>

変更履歴

第 1 刷で第 1 回リリース

SVID の第 1 刷に由来。

第 4 刷

ISO C 標準のデータの整列型式に準拠するために次の変更が行われました。

- 

関数は拡張として記されていません。

- 

「構文」の項の func() の定義に引き数 int を追加しました。

- 

第 3 刷では、このインタフェースは sigaction() を相互参照していました。 本刷では、ISO C 標準の定義に準拠して関数を完全に記述しています。

その他の変更は次のとおりです。

- 

「アプリケーション使用法」の項を追加しました。

第 4 刷バージョン 2

X/OPEN UNIX に準拠するように以下の変更が行われました。

- 

sighold()sigignore()sigpause()sigrelse()、 および sigset() 関数を「構文」に追加しました。

- 

上記の関数のインタフェースの方式を記述するために、「説明」の項を更新しました。

- 

「戻り値」の項に、 sigset() 関数固有の戻り値と、上記のすべての関数一般の戻り値を記述するテキストを追加しました。

- 

上記の関数から返されるエラーを記述するように、「エラー」の項を再構成しました。

- 

X/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> で定義されています。

SIG_DFL  

デフォルトのアクションを実行します。これはシグナルによって異なります。 ほとんどのシグナルに対するデフォルトのアクションは、プロセスを終了させるものです ( signal(5) を参照)。

actionSIG_DFL にセットされているが、保留シグナルのデフォルトのアクションがシグナルを無視するもの (SIGCLD の場合のように) ならば、 保留シグナルは ブロックされるかどうかに関わらず捨てられます。

SIG_IGN  

シグナルを無視します。

signal() が、 actionSIG_IGN にセットして呼び出され、そしてシグナル sig のインスタンスが保留中の場合、その保留シグナル は、ブロックされているかどうかにかかわらず捨てられます。

SIGKILLSIGSTOP シグナルは無視されません。

アドレス  

シグナルを捕捉します。

シグナル sig を受け取った場合、 受け取ったシグナル の action の値を SIG_DFL にリセットし (「捕捉時にリセットしない」とマークされたシグナルは除く。 signal(5) を参照)、 アドレス が指しているシグナルを受けとる関数を呼び出します。 そして、割り込まれた位置からシグナルを受けたプロセスの実行に戻ります。

シグナルを受けとる関数は、次の 3 つのパラメータで呼び出されます。

sig  

シグナル番号

code  

ハードウェアにより提供される 1 ワードの情報

scp  

<signal.h> で定義されている 機種に依存した構造体 sigcontext へのポインター

ポインター scp は シグナルを受けとる関数のコンテキストでのみ有効です。 構造体のポインター scp は常に定義されます。

codeSIGILLSIGFPE 以外のすべてのシグナルに対しては常にゼロです。 SIGILL に対して、 code は次の値を取ります。

8  

不当な命令トラップ

9  

ブレーク命令トラップ

10  

特権操作トラップ

11  

特権レジスタトラップ

SIGFPE に対しては、 code は次の値をとります。

12  

オーバーフロートラップ

13  

条件トラップ

14  

補助例外トラップ

22  

補助疑似トラップ

IEEE POSIX 標準に定められているように、 HP-UX は浮動小数点の 0 除算例外を発生しません。 浮動小数点の 0 除算の結果は無限大で、 isinf(3M) により検出することができます。

シグナル SIGKILLSIGSTOP は捕捉できません。

sigset() によって、呼び出しプロセスは、 特定のシグナルの受信を扱う 4 通りの方法から 1 つを選べます。 sig はシグナルを指定し、 func は選択を指定します。

sig 

SIGKILLSIGSTOP を除いた signal(5) で解説されているシグナルのうちの 1 つが指定できます。

func 

4 つの値、 SIG_DFLSIG_IGNSIG_HOLD、 または関数のアドレス のうち 1 つが指定されます。 SIG_DFL および SIG_IGN の動作は、 signal(5) に解説されています。 SIG_HOLD および 関数のアドレス の動作は 以下で解説します。

SIG_HOLD  

シグナルをホールドする。 シグナル sig は、受信されるとホールドされます。 シグナル sig のペンディングしているシグナルはホールドされたままになります。 それぞれのタイプのひとつのシグナルしかホールドされません。 シグナル SIGKILLSIGCONT、 および SIGSTOP はホールドできないことに注意。

関数のアドレス 

シグナルを捕捉します。 func は、 シグナル sig が発生したときに呼び出される、シグナルを受け取るハンドラー である関数へのポインターでなくてはなりません。 シグナル sig を受信したときに、 sigset() は プロセスがこの関数を呼び出すことを指定します。 シグナル sig のペンディングしているシグナルは、解放されます。 このハンドラーのアドレスは、 ここで述べられている他のシグナルを扱う関数の呼び出しでも記憶されます。 シグナル sig を受信したとき、 受け取ったプロセスは func に指される シグナルを受けとる関数を実行しますが、 signal(5) で解説されているのとは次の点で異なります。

シグナルを受け取るハンドラーを呼び出す前に、 sig に対する システムのシグナルアクションは SIG_HOLD にセットされます。 シグナルを受け取るハンドラーから正常に戻る場合、 システムのシグナルアクションは、 func に戻され、 ホールドされていたシグナル sig はすべて解放されます。 局所的でない goto ( longjmp(3C)) が行われた場合、 sigrelse() を呼び出して、 システムのシグナルアクションを func に戻し、 ホールドされている シグナル sig を解放しなければなりません。

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 に対するシステムのシグナルアクションは変更されません。

[EFAULT] 

func 引き数がプロセスのアドレス空間の有効でない部分のメモリーを指している場合。 このエラー検出の信頼性は、インプリメンテーションに依存します。

sigset()sighold()sigrelse()sigignore()、 および sigpause() は、次の場合に失敗し、 sig に対するシステムのシグナルアクションは変更されません。

[EINVAL] 

無視したり、ホールドしたり、捕捉できないシグナルのハンドラーを 無視したり、ホールドしたり、設定しようとした場合。 signal(5) を参照してください。

sigpause は、次の場合に戻ります。

[EINTR] 

シグナルが捕捉された場合

次の signal() の呼び出しは、 SIGINT シグナルに対してシグナル捕捉関数を設定します。

void myhandler(); 
 
(void) signal(SIGINT, myhandler); 

警告

signal() を、 bsdproc(3C)sigaction(2)sigset(3C)sigvector(2) で述べた機能と組み合わせて使用しないでください。

signal()action の不当な値を検出しません。 action の値が SIG_DFLSIG_IGN と等しくなく、 有効な関数のアドレスを指していない場合、次に シグナル sig を受け取った時の動作は保証されません。

著者

signal() は HP、AT&T、カリフォルニア大学バークレイ校で開発されました。

標準準拠

signal(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, ANSI C

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.