前へ | 次へ | 目次 | 索引 |
sigactionによってインストールされたシグナル・キャッチ関数によってシグナルがキャッチされると,新しいシグナル・マスクが計算され,そのシグナル・キャッチ関数の実行中は (または sigprocmaskあるいは sigsuspendが呼び出されるまでは) そのシグナル・マスクがインストールされます。このマスクは,現在のシグナル・マスクと, SA_NODEFER または SA_RESETHAND が設定されていなければ,配信されるシグナルの sa_maskの値のユニオンを計算し,さらに配信されるシグナルを加えることによって作成されます。ユーザのシグナル・ハンドラが正常に返った時点で,元のシグナル・マスクが復元されます。
いったん特定のシグナルに対するアクションがインストールされると,そのアクションは別のアクションが ( sigactionの再度の呼び出しによって ) 明示的に要求されるまで, SA_RESETHAND フラグがハンドラの再設定を引き起こすまで,またはいずれかの exec関数が呼び出されるまでインストールされたままとなります。
指定されたシグナルの以前のアクションが signalによって設定されていた場合, sigactionの o_action 引数がポイントする構造体に返されるフィールドの値は定められておらず,特に,o_action-> sa_handlerは必ずしも signalに渡された値と一致しません。ただし,同じ構造体へのポインタ,またはそのコピーが, sigactionの action 引数によってそれ以降の sigactionの呼び出しに渡された場合,シグナルは元の signal呼び出しが繰り返されたかのように処理されます。
sigactionが実行に失敗した場合には,新しいシグナル・ハンドラはインストールされません。
キャッチすることも,無視することもできないシグナルに対するアクションを SIG_DFL に設定しようとしたときに,その試みが無視されるか, errnoが EINVAL に設定されてエラーが返されるかどうかは定められていません。
シグナル処理の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2 節を参照してください。
sigvecおよび signal関数は,古い UNIX システムとの互換性のために用意されています。これらの関数の機能は, sigaction関数の機能のサブセットです。 |
sigstack, sigvec, signal, wait, read,および writeも参照してください。
0 成功を示します。 - 1 エラーを示します。新しいシグナル・ハンドラはインストールされません。 errno は以下のいずれかの値に設定されます。
- EFAULT--- action または o_action 引数は,プロセスの割り当てられたアドレス空間の外の位置をポイントしている。
- EINVAL--- sig 引数は有効なシグナル番号ではない。または,SIGKILL,SIGSTOP,および SIGCONT シグナルの無視,あるいはこれらのシグナルのハンドラの指定が試みられた。
指定された個々のシグナルを追加します。
#include <signal.h>int sigaddset (sigset_t *set, int sig_number);
set
シグナル・セット。sig_number
個々のシグナル。
sigaddset関数は,シグナルのセットを操作します。この関数は,アプリケーションからアドレス指定できるデータ・オブジェクトに作用するものであり,システムが把握している任意のシグナルのセットに適用できるわけではありません。たとえば,この関数は,プロセスへの配信がブロックされているセットや,プロセスに対して保留中となっているセットには適用できません。sigaddset関数は,sig_number で指定される個々のシグナルを set によって指定されたシグナル・セットから追加します。
次の例は,SIGINT シグナルのみの配信をブロックするシグナル・マスクを生成し,使用する方法を示しています。
#include <signal.h> int return_value; sigset_t newset; . . . sigemptyset(&newset); sigaddset(&newset, SIGINT); return_value = sigprocmask (SIG_SETMASK, &newset, NULL);
0 成功を示します。 - 1 エラーを示します。 errno には,次の値が設定されます。
- EINVAL -- sig_number の値が有効なシグナル番号でない。
配信がブロックされるシグナルの現在のセットに, mask に含まれているシグナルを追加します。
#include <signal.h>int sigblock (int mask);
mask
ブロックするシグナル。
シグナル i は,mask 内の i - 1 ビットが 1 である場合にブロックされます。たとえば,ブロックされるシグナルのセットに保護違反シグナルを追加するには,次の行を使用します。
sigblock(1 << (SIGBUS - 1));
シグナルは,ニーモニックで (保護違反の場合は SIGBUS),または <signal.h>ヘッダ・ファイルに定義されている番号で表現することができ,ビット論理和演算子 (|) を使って複数のシグナルの組み合わせを表現することができます。
x 以前のマスクされたシグナルのセットを示します。
指定された個々のシグナルを削除します。
#include <signal.h>int sigdelset (sigset_t *set, int sig_number;)
set
シグナル・セット。sig_number
個々のシグナル。
sigdelset関数は, set によって指定されたシグナル・セットから, sig_number で指定される個々のシグナルを削除します。この関数は,アプリケーションからアドレス指定できるデータ・オブジェクトに作用するものであり,システムが把握している任意のシグナルのセットに適用できるわけではありません。たとえば,この関数は,プロセスへの配信がブロックされているセットや,プロセスに対して保留中となっているセットには適用できません。
0 成功を示します。 - 1 エラーを示します。 errno には,次の値が設定されます。
- EINVAL--- sig_number の値が有効なシグナル番号でない。
シグナル・セットを初期化して,すべてのシグナルを除外します。
#include <signal.h>int sigemptyset (sigset_t *set);
set
シグナル・セット。
sigemptyset関数は, set がポイントするシグナル・セットを初期化して,すべてのシグナルを除外します。 sigset_t型のオブジェクトを他の用途に使用するためには,この型のオブジェクトに対して sigemptysetまたは sigfillset関数の呼び出しを少なくとも 1 回は行わなくてはなりません。この関数は,アプリケーションからアドレス指定できるデータ・オブジェクトに作用するものであり,システムが把握している任意のシグナルのセットに適用できるわけではありません。たとえば,この関数は,プロセスへの配信がブロックされているセットや,プロセスに対して保留中となっているセットには適用できません。
sigfillsetも参照してください。
次の例は,SIGINT シグナルのみの配信をブロックするシグナル・マスクを生成し,使用する方法を示しています。
#include <signal.h> int return_value; sigset_t newset; . . . sigemptyset(&newset); sigaddset(&newset, SIGINT); return_value = sigprocmask (SIG_SETMASK, &newset, NULL);
0 成功を示します。 - 1 エラーを示します。グローバルな errno が,エラーを示す値に設定されます。
シグナル・セットを初期化して,すべてのシグナルを含めます。
#include <signal.h>int sigfillset (sigset_t *set);
set
シグナル・セット。
sigfillset関数は, set がポイントするシグナル・セットを初期化して,すべてのシグナルを含めます。 sigset_t型のオブジェクトを他の用途に使用するためには,この型のオブジェクトに対して sigemptysetまたは sigfillsetの呼び出しを少なくとも 1 回は行わなくてはなりません。この関数は,アプリケーションからアドレス指定できるデータ・オブジェクトに作用するものであり,システムが把握している任意のシグナルのセットに適用できるわけではありません。たとえば,この関数は,プロセスへの配信がブロックされているセットや,プロセスに対して保留中となっているセットには用できません。
sigemptysetも参照してください。
0 成功を示します。 - 1 エラーを示します。 errno には,次の値が設定されます。
- EINVAL -- sig_number 引数の値が有効なシグナル番号でない。
呼び出し元プロセスのシグナル・マスクに,指定されたシグナルを追加します。
#include <signal.h>int sighold (int signal);
signal
シグナル・マスクに追加するシグナル。 signal 引数には,SIGKILL と SIGSTOP を除き, <signal.h>ヘッダ・ファイルで定義されている任意のシグナルを指定できます。
sighold, sigrelse,および sigignore関数では,簡易なシグナル管理を行うことができます。
- sighold関数は,呼び出し元プロセスのシグナル・マスクに signal を追加します。
- sigrelse関数は,呼び出し元プロセスのシグナル・マスクから, signal を削除します。
- sigignore関数は, signal の処理方法として SIG_IGN を設定します。
sighold関数を sigrelseおよび sigpauseと合わせて使用すると,コードのクリティカル・セクションでシグナルの配信を一時的に保留させることができます。
成功すると, sighold関数は値 0 を返します。失敗すると,値 - 1 を返し,エラーを示す値を errnoに設定します。
注意
これらのインタフェースは,互換性のためにのみ用意されています。新しいプログラムでは, sigactionと sigprocmaskを使用してシグナルの処理方法を制御してください。
0 成功を示します。 - 1 エラーを示します。 errno には,次の値が設定されます。
- EINVAL -- signal 引数の値が不正なシグナル番号,または SIGKILL です。
指定されたシグナルの処理方法として,SIG_IGN を設定します。
#include <signal.h>int sigignore (int signal);
signal
SIG_IGN を設定するシグナル。 signal 引数には,SIGKILL と SIGSTOP を除き, <signal.h>ヘッダ・ファイルで定義されている任意のシグナルを指定できます。
sighold, sigrelse,および sigignore関数では,簡易なシグナル管理を行うことができます。
- sighold関数は,呼び出し元プロセスのシグナル・マスクに signal を追加します。
- sigrelse関数は,呼び出し元プロセスのシグナル・マスクから, signal を削除します。
- sigignore関数は, signal の処理方法として SIG_IGN を設定します。
sighold関数を sigrelseおよび sigpauseと合わせて使用すると,コードのクリティカル・セクションでシグナルの配信を一時的に保留させることができます。
成功すると, sigignore関数は値 0 を返します。失敗すると,値 - 1 を返し,エラーを示す値を errnoに設定します。
注意
これらのインタフェースは,互換性のためにのみ用意されています。新しいプログラムでは, sigactionと sigprocmaskを使用してシグナルの処理方法を制御してください。
0 成功を示します。 - 1 エラーを示します。 errno には,次の値が設定されます。
- EINVAL -- signal 引数の値が不正なシグナル番号,または SIGKILL です。または,キャッチできないシグナルをキャッチしようとしたか,無視できないシグナルを無視しようとしました。
指定されたシグナルがシグナル・セットのメンバであるかどうかをテストします。
#include <signal.h>int sigismember (const sigset_t *set, int sig_number);
set
シグナル・セット。sig_number
個々のシグナル。
sigismember関数は,sig_number が, set がポイントするシグナル・セットのメンバであるかどうかをテストします。この関数は,アプリケーションからアドレス指定できるデータ・オブジェクトに作用するものであり,システムが把握している任意のシグナルのセットに適用できるわけではありません。たとえば,この関数は,プロセスへの配信がブロックされているセットや,プロセスに対して保留中となっているセットには適用できません。
1 成功を示します。指定されたシグナルは,指定されたセットのメンバです。 0 エラーを示します。指定されたシグナルは,指定されたセットのメンバではありません。
シグナル処理による非ローカル goto。
#include <setjmp.h>void siglongjmp (sigjmp_buf env, int value);
env
sigjmp_buf構造体のアドレス。value
ゼロ以外の値。
siglongjmp関数は,同じプロセス内で,対応する sigjmp_buf引数を使って行われた直前の sigsetjmp呼び出しによって保存された環境を復元します。すべてのアクセス可能なオブジェクトは, siglongjmpの呼び出し時に値を持ちます。唯一の例外として, sigsetjmp呼び出しと siglongjmp呼び出しの間に変更された自動記憶時間のオブジェクトの値は不定です。
siglongjmpは通常の関数呼び出しとリターン・メカニズムをバイパスするので,割り込み,シグナル,およびそれらの関連する関数の実行中も正しく動作します。ただし, siglongjmpをネストしたシグナル・ハンドラ (たとえば,別のシグナルの処理中に生成したシグナルの結果として呼び出された関数) から呼び出した場合の動作は未定義です。
siglongjmp関数は,ゼロ以外の savemask 引数で sigsetjmpを呼び出して env 引数を初期化した場合にのみ,保存されていたシグナル・マスクを復元します。
siglongjmpの完了後,プログラムは,対応する sigsetjmpの呼び出しが value によって指定された値で返ったかのように実行を続けます。 siglongjmp関数は, sigsetjmpに 0 (ゼロ) を返させることはできません。 value が 0 ならば, sigsetjmpは 1 を返します。
sigsetjmpも参照してください。
前へ | 次へ | 目次 | 索引 |