名 前
getcontext, setcontext − ユ ー ザ ー コ ン テ キ ス ト を 取 得 /設 定 す る
書 式
#include <ucontext.h>
int
getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
説 明
System V 的 な 環 境 で は 、 mcontext_t お よ び ucontext_t と い う 2 つ の 型 と 、 getcontext(), setcontext(), makecontext(3), swapcontext(3) と い う 4 つ の 関 数 が <ucontext.h> で 定 義 さ れ て お り 、 あ る プ ロ セ ス 内 部 で 制 御 下 に あ る 複 数 の ス レ ッ ド 間 で 、 ユ ー ザ ー レ ベ ル の コ ン テ キ ス ト 切 替 え が で き る よ う に な っ て い る 。
mcontext_t 型 は マ シ ン 依 存 で 、 外 部 か ら は 隠 蔽 さ れ て い る 。 ucontext_t 型 は 構 造 体 で 、 少 な く と も 以 下 の 4 つ の フ ィ ー ル ド を 持 つ 。
typedef struct
ucontext {
struct ucontext *uc_link;
sigset_t uc_sigmask;
stack_t uc_stack;
mcontext_t uc_mcontext;
... }
ucontext_t;
sigset_t と stack_t は <signal.h> で 定 義 さ れ て い る 。 こ こ で uc_link は 、 現 在 の コ ン テ キ ス ト が 終 了 し た と き 、 続 い て 切 り 替 わ る コ ン テ キ ス ト へ の ポ イ ン タ ー で あ る (現 在 の コ ン テ キ ス ト が makecontext(3) で 生 成 さ れ た も の の 場 合 )。 uc_sigmask は こ の コ ン テ キ ス ト で ブ ロ ッ ク さ れ て い る シ グ ナ ル 群 で あ る (sigprocmask(2) を 見 よ )。 uc_stack は こ の コ ン テ キ ス ト が 用 い て い る ス タ ッ ク で あ る (signalstack(2) を 見 よ )。 uc_mcontext は 保 存 さ れ て い る コ ン テ キ ス ト の マ シ ン 特 有 の 表 現 形 式 で あ り 、 こ こ に は 呼 び 出 し た ス レ ッ ド の マ シ ン レ ジ ス タ ー が 格 納 さ れ る 。
getcontext() 関 数 は 、 ポ イ ン タ ー ucp が 指 す 構 造 体 を 、 現 在 ア ク テ ィ ブ な コ ン テ キ ス ト に 初 期 化 す る 。
setcontext() 関 数 は 、 ポ イ ン タ ー ucp が 指 す ユ ー ザ ー コ ン テ キ ス ト を リ ス ト ア す る 。 呼 び 出 し に 成 功 す る と 返 ら な い 。 こ の コ ン テ キ ス ト は 、 以 前 に getcontext() ま た は makecontext(3) で 得 ら れ た も の か 、 あ る い は シ グ ナ ル の 第 三 引 数 と し て 与 え ら れ た も の に な る 。 コ ン テ キ ス ト が getcontext() の 呼 び 出 し に よ っ て 得 ら れ て い た も の の 場 合 は 、 プ ロ グ ラ ム は こ の 呼 び 出 し か ら 返 っ た 直 後 か ら の よ う に 実 行 を 継 続 す る 。 コ ン テ キ ス ト が makecontext(3) の 呼 び 出 し に よ っ て 得 ら れ て い た も の の 場 合 は 、 プ ロ グ ラ ム の 実 行 は そ の makecontext(3) 呼 び 出 し の 第 二 引 数 で 指 定 さ れ た 関 数 func を 呼 び 出 す か た ち で 継 続 す る 。 func か ら 返 る と 、 makecontext(3) 呼 び 出 し の 第 一 引 数 で 指 定 さ れ て い た ucp 構 造 体 の uc_link メ ン バ で 継 続 す る 。 こ の メ ン バ が NULL だ っ た 場 合 は 、 そ の ス レ ッ ド は 終 了 す る 。 コ ン テ キ ス ト が シ グ ナ ル ハ ン ド ラ ー の 呼 び 出 し に よ っ て 得 ら れ て い た も の の 場 合 は 、 古 い 標 準 に よ れ ば 「 プ ロ グ ラ ム の 実 行 は シ グ ナ ル に よ っ て 割 り 込 ま れ た 命 令 の 次 の 命 令 か ら 継 続 さ れ る 」 。 し か し こ の 文 は SUSv2 で 削 除 さ れ た の で 、 現 在 の 判 断 は 「 結 果 は 定 義 さ れ て い な い 」 で あ る 。
返 り 値
成 功 す る と 、 getcontext() は 0 を 返 し 、 setcontext() は 返 ら な い 。 失 敗 す る と 、 両 者 と も −1 を 返 し 、 errno を エ ラ ー に 応 じ て 設 定 す る 。
エ ラ ー
定 義 さ れ て い な い 。
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 getcontext() と setcontext() は ス レ ッ ド セ ー フ で あ る 。
準 拠
SUSv2, POSIX.1−2001. POSIX.1−2008 で は 、 移 植 性 の 問 題 か ら getcontext() の 仕 様 が 削 除 さ れ た 。 代 わ り に 、 ア プ リ ケ ー シ ョ ン を POSIX ス レ ッ ド を 使 っ て 書 き 直 す こ と が 推 奨 さ れ て い る 。
注 意
こ の メ カ ニ ズ ム の 最 古 の 実 装 は 、 setjmp(3)/longjmp(3) 機 構 で あ っ た 。 こ れ ら に は シ グ ナ ル コ ン テ キ ス ト の 取 り 扱 い が 定 義 さ れ て い な か っ た の で 、 次 の 段 階 で は sigsetjmp(3)/siglongjmp(3) の ペ ア が 現 わ れ た 。 現 在 の 機 構 で は ず っ と 細 か な 制 御 が で き る 。 一 方 getcontext() か ら 返 っ た と き 、 こ れ が 最 初 の 呼 び 出 し で あ っ た か 、 そ れ と も setcontext() 呼 び 出 し か ら の も の で あ る か を 区 別 す る 容 易 な 方 法 が な く な っ て し ま っ た 。 ユ ー ザ ー は 「 し お り 」 機 構 を 自 分 で 作 ら な け れ ば な ら な い 。 レ ジ ス タ ー 変 数 は (レ ジ ス タ ー は リ ス ト ア さ れ て し ま う の で ) こ れ を や っ て く れ な い 。 シ グ ナ ル が 発 生 す る と 、 現 在 の ユ ー ザ ー コ ン テ キ ス ト は 保 存 さ れ 、 シ グ ナ ル ハ ン ド ラ ー 用 の コ ン テ キ ス ト が カ ー ネ ル に よ っ て 生 成 さ れ る 。 今 後 は ハ ン ド ラ ー に longjmp(3) を 使 わ せ な い こ と : こ の 関 数 の コ ン テ キ ス ト 下 で の 動 作 は 定 義 さ れ て い な い 。 代 わ り に siglongjmp(3) か setcontext() を 使 う こ と 。
関 連 項 目
sigaction(2), sigaltstack(2), sigprocmask(2), longjmp(3), makecontext(3), sigsetjmp(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。