前へ | 次へ | 目次 | 索引 |
指定されたシグナル番号のためのマスクを作成します。
#include <signal.h>int sigmask (signum);
signum
マスクを作成するシグナル番号。
sigmask関数は,指定された signum のためのマスクを作成するために使用されます。このマスクは, sigblock関数で使用することができます。
x signum のために作成されたマスク。
シグナル sig の処理方法を指定することができます。シグナルのデフォルト処理を使用するか,シグナルを無視するか,または指定されたアドレスのシグナル・ハンドラを呼び出すことができます。
#include <signal.h>void (*signal (int sig, void (*func) (int))) (int);
sig
シグナルに関連付けられた番号またはニーモニック。この引数は,通常は <signal.h>ヘッダ・ファイルに定義されているニーモニックの 1 つです。func
シグナルが生成されたときに実行するアクション,またはシグナルの処理に必要な関数のアドレス。
func が定数 SIG_DFL だった場合,指定されたシグナルに対するアクションはデフォルトのアクション,すなわち受信側プロセスの終了に再設定されます。引数が SIG_IGN だった場合には,シグナルは無視されます。すべてのシグナルを無視できるわけではありません。func が SIG_DFL でも SIG_IGN でもない場合,この func はシグナル処理関数のアドレスを指定します。シグナルが生成されると,アドレスが指定された関数が, sig を引数として指定して呼び出されます。アドレスが指定された関数が返ると,割り込まれたプロセスは,割り込みのポイントから実行を続けます ( これはシグナルのキャッチと呼ばれます。シグナルは,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4 章に示した例外のケースを除き,キャッチ後は SIG_DFL に再設定されます)。
signal関数は,シグナルをキャッチしようとするたびに呼び出す必要があります。
シグナル処理の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2 節を参照してください。
OpenVMS 例外またはシグナルで UNIX スタイルのシグナルを生成させるためには, OpenVMS 条件ハンドラは,自分で処理する気がない例外を受信したときに SS$_RESIGNAL を返さなくてはなりません。 SS$_CONTINUE を返すと,UNIX スタイル・シグナルは正しく生成されません。 UNIX シグナルに対応する OpenVMS 例外のリストについては,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4 章を参照してください。
x 以前にシグナルを処理するように設定された関数のアドレス。 SIG_ERR sig 引数が範囲外であることを示します。
現在のマスクされたシグナルのセットに mask を割り当て,シグナルを待ちます。
#include <signal.h>int sigpause (int mask);
mask
ブロックするシグナル。
mask 引数の詳細については, sigblock関数を参照してください。制御が sigpauseに戻ると,関数は以前のマスクされたシグナルのセットを復元し, errnoを EINTR に設定し,割り込みがあったことを示すために - 1 を返します。値 EINTR は <errno.h>ヘッダ・ファイルに定義されています。
- 1 割り込みを示します。 errno は EINTR に設定されます。
保留中のシグナルを確認します。
#include <signal.h>int sigpending (sigset_t *set);
set
sigset_t構造体へのポインタ。
sigpending関数は,配信がブロックされ,呼び出し元プロセスに対して保留中になっているシグナルのセットを, set 引数がポイントする位置に格納します。sigset_t型のオブジェクトを他の用途に使用するためには,この型のオブジェクトに対して sigemptysetまたは sigfillsetの呼び出しを少なくとも 1 回は行わなくてはなりません。この方法でオブジェクトを初期化せずに, sigpending関数への引数を指定した場合の結果は未定義です。
sigemptysetと sigfillsetも参照してください。
0 成功を示します。 - 1 エラーを示します。 errno は次の値に設定されます。
- SIGSEGV---不正なマスク引数。
現在のシグナル・マスクを設定します。
#include <signal.h>int sigprocmask (int how, const sigset_t *set, sigset_t *o_set);
how
マスクされたシグナルのセットをどのように変更するかを示す整数値。以下のいずれかの値を使用します。
SIG_BLOCK 結果として得られるセットは,現在のセットと, set 引数がポイントしているシグナル・セットのユニオンです。 SIG_UNBLOCK 結果として得られるセットは,現在のセットと, set 引数がポイントしているシグナル・セットの補集合のインタセクションです。 SIG_SETMASK 結果として得られるセットは, set 引数がポイントしているシグナル・セットです。
set
シグナル・セット。set 引数の値に応じて,次の意味を持ちます。
- NULL でない---現在ブロックされているセットを変更するために使用されるシグナルのセットをポイントする。
- NULL---how 引数の値は意味を持たず,プロセス・シグナル・マスクは変更されない。したがって,この呼び出しは現在ブロックされているシグナルを照会する目的に使用できる。
o_set
呼び出しの時点で有効だったシグナル・マスクが格納される位置への NULL でないポインタ。
sigprocmask関数は,呼び出し元プロセスのシグナル・マスクの確認または変更に使用されます。一般に,コードのクリティカル・セクションの間は sigprocmaskで SIG_BLOCK 値を使用してシグナルをブロックし, sigprocmaskで SIG_BLOCK 値から返された以前の値にマスクを復元するときには sigprocmaskで SIG_SETMASK 値を使用します。
sigprocmask関数の呼び出しの後に,保留中になっているブロックされていないシグナルが存在する場合,これらのシグナルのうちの少なくとも 1 つが, sigprocmask関数が返る前に配信されます。
sigprocmask関数では SIGKILL シグナルや SIGSTOP シグナルをブロックすることはできません。プログラムがこれらのシグナルの 1 つをブロックしようと試みた場合でも, sigprocmask関数はエラーを発生させません。
次の例は,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--- how 引数の値が,どの定義済みの値とも等しくない。
- EFAULT--- set または o_set 引数は,プロセスの割り当てられたアドレス空間の外の位置をポイントしている。
呼び出し元プロセスのシグナル・マスクから,指定されたシグナルを削除します。
#include <signal.h>int sigrelse (int signal);
signal
シグナル・マスクから削除するシグナル。 signal 引数には,SIGKILL と SIGSTOP を除き, <signal.h>ヘッダ・ファイルで定義されている任意のシグナルを指定できます。
sighold, sigrelse,および sigignore関数では,簡易なシグナル管理を行うことができます。
- sighold関数は,呼び出し元プロセスのシグナル・マスクに signal を追加します。
- sigrelse関数は,呼び出し元プロセスのシグナル・マスクから, signal を削除します。
- sigignore関数は, signal の処理方法として SIG_IGN を設定します。
sighold関数を sigrelseおよび sigpauseと合わせて使用すると,コードのクリティカル・セクションでシグナルの配信を一時的に保留させることができます。
成功すると, sigrelse関数は値 0 を返します。失敗すると,値 - 1 を返し,エラーを示す値を errnoに設定します。
注意
これらのインタフェースは,互換性のためにのみ用意されています。新しいプログラムでは, sigactionと sigprocmaskを使用してシグナルの処理方法を制御してください。
0 成功を示します。 - 1 エラーを示します。 errno には,次の値が設定されます。
- EINVAL -- signal 引数の値が不正なシグナル番号,または SIGKILL です。
非ローカル goto のジャンプ・ポイントを設定します。
#include <setjmp.h>init sigsetjmp (sigjmp_buf env, int savemask);
env
sigjmp_buf構造体のアドレス。savemask
現在のシグナル・マスクを保存する必要があるかどうかを指定する整数値。
sigsetjmp関数は,呼び出し元環境を,後に siglongjmp関数で使用できるように env 引数に保存します。savemask の値が 0 (ゼロ) でない場合, sigsetjmpはプロセスの現在のシグナル・マスクも,呼び出し元環境の一部として保存します。
siglongjmpも参照してください。
OpenVMS 条件ハンドラから longjmp関数を呼び出すことはできません。ただし,以下のネスト制約の範囲内で, HP C RTL がサポートしている任意のシグナルに対して確立されたシグナル・ハンドラから longjmpを呼び出すことができます。
- longjmp関数は,ネストしたシグナル・ハンドラから呼び出された場合には動作しない。他のシグナル・ハンドラ内で生成された例外の結果として実行されたシグナル・ハンドラから呼び出された longjmp関数の結果は未定義である。
- 対応する longjmpを,シグナルの処理が完了する前に発行したい場合を除いて,シグナル・ハンドラから sigsetjmp関数を呼び出してはならない。
- 終了ハンドラ ( atexitまたは SYS$DCLEXH で設定) の中から longjmp関数を呼び出してはならない。終了ハンドラはイメージのティアダウンの後に呼び出されるので, longjmpのデスティネーション・アドレスは存在しなくなっている。
- シグナル・ハンドラの中から,メインの実行スレッドに戻るために longjmpを呼び出すと,プログラムの状態の一貫性が失われることがある。副作用として,I/O が実行できなくなったり, UNIX シグナルを受信できなくなったりする可能性がある。代わりに siglongjmpを使用すること。
0 成功を示します。 ゼロ以外 siglongjmp 関数の呼び出しが行われます。
配信がブロックされるシグナルを設定します。
#include <signal.h>int sigsetmask (int mask);
mask
ブロックするシグナル。
mask 引数の詳細については, sigblock関数を参照してください。
x マスクされたシグナルの以前のセット。
シグナルの処理に使用される代替スタックを定義します。これにより,カレント・プロセスとは別の環境でシグナルを処理できるようになります。この関数は非リエントラントです。
#include <signal.h>int sigstack (struct sigstack *ss, struct sigstack *oss);
ss
ss が NULL でない場合には,シグナルを配信するシグナル・スタックとして使用される指定されたメモリ・セクションへのポインタを保持する構造体のアドレスを指定します。oss
oss が NULL でない場合には,スタック・アドレスの古い値が返される構造体のアドレスを指定します。
sigstack構造体は,標準ヘッダ・ファイル <signal.h>に定義されています。
struct sigstack { char *ss_sp; int ss_onstack; };
sigvec関数が,シグナル・ハンドラをシグナル・スタック上で実行するように指定した場合,システムはプロセスがすでにそのスタック上で実行されているかどうかをチェックします。プロセスがシグナル・スタック上で実行されていなければ,システムはシグナル・ハンドラが実行されている間はシグナル・スタックに切り替えるように調整を行います。 oss 引数が NULL でなければ,シグナル・スタックの現在の状態が返されます。
シグナル・スタックには適切な量のストレージが割り当てられなくてはなりません。ランタイム・スタックのように拡張されることはないからです。たとえば,シグナル・ハンドラが printfや,これと同じほど複雑な HP C RTL ルーチンを呼び出す場合には,シグナル・スタック用に少なくとも 12,000 バイトのストレージを割り当てる必要があります。スタックがオーバフローを起こすと,エラーが発生します。
ss_spは,割り当てられたメモリ領域の終端よりも少なくとも 4 バイト前の位置をポイントしていなくては なりません (例を参照)。これはアーキテクチャに依存しており,他のマシン・アーキテクチャやオペレーティング・システムへの移植性はないと考えられます。
0 成功を示します。 - 1 失敗を示します。
#define ss_size 15000 static char mystack[ss_size]; struct sigstack ss = {&mystack + sizeof(mystack) - sizeof(void *), 1};
前へ | 次へ | 目次 | 索引 |