標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <setjmp.h>
int sigsetjmp(sigjmp_buf env, int savemask);
オプションでの現行シグナル・マスクを含む、現行スタック環境を 保管します。sigsetjmp() によって保管されたスタック環境およびシグナル・マスクは、あとで siglongjmp() を使って復元できます。
env は、sigjmp_buf 構造体のアドレスです。savemask は、シグナル・マスクを保管するかどうかを 決定するのに使用されるフラグです。これに 0 の値があった場合には、現行シグナル・マスクは 環境の一部として保管または復元されません。その他のどの値も、現行シグナル・マスクの保管および復元が 行われることを意味します。
シグナル・マスク保存のオプション機能を除けば、sigsetjmp() は setjmp() および _setjmp() に 似ています。setjmp() および longjmp() と同様に、sigsetjmp() と siglongjmp() 関数は、非ローカル goto
を実行する方法を提供します。sigsetjmp() と siglongjmp() の対、setjmp() と longjmp() の対、_setjmp() と _longjmp() の対、および getcontext() と setcontext() の対を混用することはできません。sigsetjmp() によって保管されたスタック環境およびシグナル・マスクは、siglongjmp() でのみ復元できます。
sigsetjmp() を呼び出すと、現行スタック環境が env に保管されます。savemask パラメーターの値がゼロ以外の場合には、現行シグナル・マスクも env に保管されます。siglongjmp() への以降の呼び出しにより、保管済み環境および シグナル・マスク (sigsetjmp() で保管された場合) が復元され、制御が sigsetjmp() 呼び出しに対応するポイントへ戻されます。制御を受信する関数にアクセス可能な (レジスター変数を除いた) すべての変数の値に、siglongjmp() の呼び出し時に保持していた値が 含まれています。レジスター変数の値は、予測不可能です。sigsetjmp() と siglongjmp() の間の呼び出しで変更される、非揮発性の auto 変数も予測不可能です。
C++ の特殊な動作: sigsetjmp() と siglongjmp() を使用して z/OS® XL C++ プログラム内の制御権を移動すると、自動オブジェクトの破壊に関する動作は未定義です。 これは z/OS XL C++ と z/OS XL C/C++ の ILC の両方のモジュールに当てはまります。 sigsetjmp() と siglongjmp() の、try()、catch()、および throw() との併用も未定義です。
スタック環境およびシグナル・マスクの保管のために起動される際に、sigsetjmp() は 0 を戻します。
sigsetjmp() が発行されたユーザーのプログラム内の所定位置に制御が siglongjmp() によって転送される場合、sigsetjmp() は、siglongjmp() で指定されている値 val を戻します (val の値がゼロの場合には 1 を戻します)。
設定される errno 値はありません。
if(sigsetjmp(mark,1) != 0) …
sigsetjmp() has been called
siglongjmp() has been called
#define _POSIX_SOURCE
#include <stdio.h>
#include <setjmp.h>
sigjmp_buf mark;
void p(void);
void recover(void);
int main(void)
{
if (sigsetjmp(mark,1) != 0) {
printf("siglongjmp() has been called¥n");
recover();
exit(1);
}
printf("sigsetjmp() has been called¥n");
⋮
p();
⋮
}
void p(void)
{
int error = 0;
⋮
error = 9;
⋮
if (error != 0)
siglongjmp(mark, -1);
⋮
}
void recover(void)
{
⋮
}