名 前
setjmp, sigsetjmp − 非 局 所 的 な ジ ャ ン プ の た め に 、 ス タ ッ ク コ ン テ キ ス ト (stack context) を 保 存 す る
書 式
#include <setjmp.h>
int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
setjmp():
「 注 意 」 参 照
。
sigsetjmp(): _POSIX_C_SOURCE >= 1 ||
_XOPEN_SOURCE || _POSIX_C_SOURCE
説 明
setjmp() と longjmp(3) は 、 プ ロ グ ラ ム の 低 レ ベ ル な サ ブ ル ー チ ン に お い て 、 エ ラ ー や 割 り 込 み が 発 生 し た 時 の 処 理 に 便 利 で あ る 。 setjmp() は 、 longjmp(3) に よ っ て 使 わ れ る env に ス タ ッ ク コ ン テ キ ス ト /ス タ ッ ク 環 境 を 保 存 す る 。 setjmp() を 呼 び 出 し た 関 数 が 返 る と き に 、 そ の ス タ ッ ク コ ン テ キ ス ト は 無 効 に な る 。
sigsetjmp() も setjmp() と 同 様 で あ る 。 savesigs が 0 以 外 の 場 合 、 こ の プ ロ セ ス の 現 在 の シ グ ナ ル マ ス ク も env に 保 存 さ れ 、 こ の シ グ ナ ル は 後 で siglongjmp(3) が こ の env で 実 行 さ れ た 際 に 復 元 さ れ る 。
返 り 値
直 接 返 っ て く る と き は 、 setjmp() と sigsetjmp() は 0 を 返 し 、 保 存 し た コ ン テ キ ス ト を 使 っ て longjmp(3) や siglongjmp(3) か ら 返 っ て く る と き は 0 以 外 を 返 す 。
準 拠
setjmp() は C89, C99, POSIX.1−2001 で 規 定 さ れ て い る 。 sigsetjmp() は POSIX.1−2001 で 規 定 さ れ て い る 。
注 意
POSIX は 、 (longjmp() 中 で 後 で 復 元 で き る よ う に ) setjmp() が シ グ ナ ル マ ス ク を 保 存 す べ き か ど う か を 規 定 し て い な い 。 System V で は 保 存 し な い 。 4.3BSD で は 保 存 す る ; 4.3BSD に は シ グ ナ ル コ ン テ キ ス ト を 保 存 し な い 関 数 _setjmp も あ る 。 バ ー ジ ョ ン 2.19 よ り 前 の glibc を 使 う Linux で は 、 setjmp() は デ フ ォ ル ト で は System V の 振 る 舞 い に 従 う が 、 _BSD_SOURCE 機 能 検 査 マ ク ロ が 定 義 さ れ 、 _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _GNU_SOURCE, _SVID_SOURCE の い ず れ も 定 義 さ れ て い な い 時 は BSD の 振 る 舞 い と な る 。 glibc 2.19 以 降 で は 、 <setjmp.h> は System V 版 の setjmp() の み を 公 開 す る よ う に な っ て い る 。 BSD の 動 作 を 必 要 と す る プ ロ グ ラ ム で は 、 setjmp() の 呼 び 出 し を 、 savesigs 引 き 数 に 0 以 外 の 値 を 渡 す sigsetjmp() に 置 き 換 え る べ き で あ る 。 移 植 性 の あ る 形 で シ グ ナ ル マ ス ク を 保 存 お よ び 復 元 し た い の な ら 、 sigsetjmp() と siglongjmp(3) を 使 う こ と 。
setjmp() や sigsetjmp() を 使 う と 、 プ ロ グ ラ ム は 理 解 し づ ら く 、 保 守 し に く い も の に な る 。 別 の 方 法 が 可 能 な ら 、 そ れ を 使 う べ き で あ る 。
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。