HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
非ローカル 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};
ブロックされているシグナルのセットをアトミックに変更し,シグナルを待ちます。
#include <signal.h>int sigsuspend (const sigset_t *signal_mask);
signal_mask
シグナルのセットへのポインタ。
sigsuspend関数は,プロセスのシグナル・マスクを, signal_mask 引数がポイントするシグナルのセットに置き換えます。その後,アクションとしてシグナル・キャッチ関数を実行するか,プロセスを終了させるシグナルが配信されるまで,プロセスの実行を中断します。 sigsuspend関数では, SIGKILL シグナルや SIGSTOP シグナルをブロックすることはできません。プログラムがこれらのシグナルのブロックを試みた場合でも, sigsuspendはエラーを発生させません。シグナルの配信によってプロセスが終了する場合, sigsuspendは返りません。シグナルの配信によってシグナル・キャッチ関数が実行される場合, sigsuspendはシグナル・キャッチ関数が返った後に返り,シグナル・マスクは sigsuspendの呼び出しの前のセットに復元されます。
sigsuspend関数は,1 つのアトミックな操作として,シグナル・マスクを設定し,ブロックされていないシグナルを待ちます。つまり,マスクの設定とシグナルを待つ操作の間にシグナルを発生させることはできません。プログラムが sigprocmaskSIG_SETMASK と sigsuspendを別々に呼び出した場合,これらの関数の間に発生したシグナルは,通常は sigsuspendには意識されません。
通常の用途では,シグナルはクリティカル・セクションの先頭で, sigprocmask関数を使ってブロックされます。その後,プロセスは実行すべき作業があるかどうかを調べます。作業がなければ,プロセスは,前に sigprocmaskから返されたマスクを使って sigsuspendを呼び出して,作業を待ちます。
シグナルが呼び出し元プロセスによってキャッチされ,制御がシグナル・ハンドラから返った場合,呼び出し元プロセスは sigsuspendの後から実行を再開します。 sigsuspendはつねに値 - 1 を返し, errnoを EINTR に設定します。
sigpauseと sigprocmaskも参照してください。
呼び出し元スレッドを中断し,シグナル通知が到着するのを待ちます。
#include <signal.h>int sigtimedwait (const sigset_t set, siginfo_t *info, const struct timespec *timeout);
set
待機するシグナルのセット。info
siginfo構造体へのポインタ。この構造体には,シグナルをポストする際に指定されたアプリケーション定義データなど,シグナルを示すデータが格納されます。timeout
待機する際のタイムアウト時間。 timeout が NULL の場合,この引数は無視されます。
sigtimedwait関数は, sigwaitinfo関数と同じ動作を行います。ただし,set で指定されたシグナルが保留されていない場合, sigtimedwaitは timeout が指す timespec構造体で指定された時間だけ待機します。 timeout が指す timespec構造体の値がゼロで, set で指定されたシグナルが保留されていない場合, sigtimedwaitはすぐにエラーで戻ります。sigwaitと sigwaitinfoも参照してください。
シグナル処理についての詳細は,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2 節を参照してください。
x 成功して終了すると,選択されたシグナル番号が返されます。 -1 エラーの発生を示します。 errno には,以下のいずれかの値が設定されます。
- EINVAL -- timeout 引数の tv_nsec 値が, 0 より小さいか 10 億以上でした。
- EINTR -- 待機が,ブロックされていないシグナルのキャッチで割り込まれました。
- EAGAIN -- set で指定されたシグナルが,指定されたタイムアウト期間内に生成されませんでした。
特定のシグナルのためのハンドラを永久的に割り当てます。
#include <signal.h>int sigvec (int sigint, struct sigvec *sv, struct sigvec *osv);
sigint
シグナル識別子。sv
sigvec構造体へのポインタ (説明のセクションを参照)。osv
osv が NULL でない場合には,シグナルの以前の処理情報が返されます。
sv が NULL でない場合には,ハンドラ・ルーチンへのポインタ,指定されたシグナルを配信するときに使用されるマスク,およびシグナルを代替スタック上で処理するべきかどうかを示すフラグを含んだ構造体のアドレスを指定します。 sv-->onstack の値が 1 である場合,システムはシグナルを sigstackで指定されたシグナル・スタック上のプロセスに配信します。sigvec関数は,明示的に削除されるかイメージが終了するまで存在を続けるハンドラを設定します。
sigvec構造体は, <signal.h>ヘッダ・ファイルに定義されています。
struct sigvec { int (*handler)(); int mask; int onstack; };
シグナル処理の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2 節を参照してください。
0 呼び出しが成功したことを示します。 -1 エラーが発生したことを示します。
呼び出し元スレッドを中断し,シグナル通知が到着するのを待ちます。
#include <signal.h>int sigwait (const sigset_t set, int *sig);
set
待機するシグナルのセット。sig
選択されたシグナルのシグナル番号を返します。
sigwait関数は, set 引数内のシグナルの少なくとも 1 つが,呼び出し元プロセスの保留シグナル・セットに含まれるようになるまで,呼び出し元スレッドを中断します。この状態が発生したら,いずれかのシグナルが自動的に選択され,保留シグナル・セットから削除されます。その後,シグナルを識別するシグナル番号が, sig が指すメモリ位置に返されます。sigwait関数が呼び出されたときに, set 引数内のシグナルにブロックされていないものがある場合の動作は,規定されていません。
set 引数は,セット操作関数 sigemptyset, sigfillset, sigaddset,および sigdelsetを使用して作成されます。
sigwait関数が待機している間に,配信可能な (つまり,シグナル・マスクでブロックされていない) シグナルが発生すると,そのシグナルは非同期に処理され,待機状態が中断されます。
sigtimedwaitと sigwaitinfoも参照してください。
シグナル処理についての詳細は,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2 節を参照してください。
0 成功すると, sigwait は sig が指すメモリ位置に,受信したシグナルのシグナル番号を格納して,0 を返します。 0 以外 エラーの発生を示します。 errno に,次の値が設定されます。
- EINVAL -- set 引数が,不正なシグナル番号,またはサポートされていないシグナル番号を含んでいます。
呼び出し元スレッドを中断し,シグナル通知が到着するのを待ちます。
#include <signal.h>int sigwaitinfo (const sigset_t set, siginfo_t *info);
set
待機するシグナルのセット。info
siginfo構造体へのポインタ。この構造体には,シグナルをポストする際に指定されたアプリケーション定義データなど,シグナルを示すデータが格納されます。
info 引数が NULL の場合, sigwaitinfo関数は, sigwait関数と同じ動作を行います。info 引数が NULL でない場合, sigwaitinfo関数は, sigwait関数と同じ動作を行います。ただし,選択されたシグナル番号は, siginfo構造体の si_signoメンバに格納され,またシグナルの原因が, si_codeメンバに格納されます。選択されたシグナルに,キューイングされている値がある場合,キューイングされている 1 番目の値がキューから外され,その値が info の si_valueメンバに格納されます。シグナルのキューイングに使用されているシステム・リソースは解放され,他のシグナルのキューイングに利用できるようになります。キューイングされている値がない場合, si_valueメンバの内容は未定義です。選択されたシグナルに対して,他にキューイングされているシグナルがない場合は,そのシグナルの保留表示がリセットされます。
sigtimedwaitと sigwaitも参照してください。
シグナル処理についての詳細は,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2 節を参照してください。
x 成功すると,選択されたシグナル番号が返されます。 -1 エラーの発生を示します。 errno には,以下のいずれかの値が設定されます。
- EINVAL -- set 引数が,不正なシグナル番号,またはサポートされていないシグナル番号を含んでいます。
- EINTR -- 待機が,ブロックされていないシグナルのキャッチで割り込まれました。
ラジアン単位の引数の正弦を返します。
#include <math.h>double sin (double x);
float sinf (float x); (Alpha, I64)
long double sinl (long double x); (Alpha, I64)
double sind (double x); (Alpha, I64)
float sindf (float x); (Alpha, I64)
long double sindl (long double x); (Alpha, I64)
x
浮動小数点数として表現されたラジアン。
sin関数は,ラジアン単位の x の正弦を計算します。sind関数は,度単位の x の正弦を計算します。
x 引数の正弦。 NaN x = ±Infinity or NaN; errno is set to EDOM. 0 アンダフローが発生しました。 errno は ERANGE に設定されます。
| 前へ | 次へ | 目次 | 索引 |