名 前
sigaltstack − シ グ ナ ル ス タ ッ ク の コ ン テ キ ス ト を 設 定 ・ 取 得 す る
書 式
#include <signal.h>
int sigaltstack(const stack_t *ss, stack_t *oss);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
sigaltstack():
_BSD_SOURCE ||
_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
|| /* glibc 2.12 以 降 : */
_POSIX_C_SOURCE >= 200809L
説 明
sigaltstack() を 使 う と 、 プ ロ セ ス は 新 し い 代 替 シ グ ナ ル ス タ ッ ク を 定 義 し た り 、 既 存 の 代 替 シ グ ナ ル ス タ ッ ク の 状 態 を 取 得 で き る 。 シ グ ナ ル ハ ン ド ラ ー が 代 替 シ グ ナ ル ス タ ッ ク を 要 求 す る よ う に 設 定 さ れ て い る と (sigaction(2) 参 照 )、 ハ ン ド ラ ー の 実 行 中 は そ の シ グ ナ ル ス タ ッ ク が 使 わ れ る 。 代 替 シ グ ナ ル ス タ ッ ク を 使 う 際 の 一 般 的 な 手 順 は 、 以 下 の 通 り で あ る :
1. 代 替 シ グ ナ ル ス タ ッ ク で 使 う メ モ リ ー 領 域 を 確 保 す る 。 |
||
2. |
sigaltstack() を 使 っ て 、 代 替 シ グ ナ ル ス タ ッ ク の 存 在 と 場 所 を シ ス テ ム に 知 ら せ る 。
3. |
sigaction(2) を 使 っ て シ グ ナ ル ハ ン ド ラ ー を 確 立 す る 際 、 SA_ONSTACK フ ラ グ を 指 定 す る こ と に よ り 、 そ の シ グ ナ ル ハ ン ド ラ ー を 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 す る こ と を シ ス テ ム に 知 ら せ る 。 |
ss 引 き 数 は 、 新 し い シ グ ナ ル ス タ ッ ク を 指 定 す る た め に 使 う 。 ま た oss 引 き 数 は 、 現 在 確 立 さ れ て い る シ グ ナ ル ス タ ッ ク の 情 報 を 取 得 す る た め に 使 う 。 こ の 操 作 の う ち 1 つ だ け を 実 行 さ せ る に は 、 使 用 し な い 引 き 数 を NULL に 指 定 す れ ば よ い 。 引 き 数 と な る 構 造 体 は 、 以 下 の よ う な 型 で あ る :
typedef struct
{
void *ss_sp; /* ス タ ッ ク の
ベ ー ス ア ド レ
ス */
int ss_flags; /* フ ラ グ */
size_t ss_size; /* ス タ ッ ク
の バ イ ト 数 */ }
stack_t; 新 規 の 代 替
シ グ ナ ル ス タ
ッ ク を 確 立 す
る に は 、 ss.ss_flags
を 0 に 設 定 し 、
ss.ss_sp と ss.ss_size に ス
タ ッ ク の 開 始
ア ド レ ス と ス
タ ッ ク サ イ ズ
を 指 定 す る 。
定 数 SIGSTKSZ は 、 代
替 シ グ ナ ル ス
タ ッ ク が 通 常
必 要 す る サ イ
ズ よ り も 充 分
大 き く 定 義 さ
れ て い る 。 ま
た 定 数 MINSIGSTKSZ は
、 シ グ ナ ル ハ
ン ド ラ ー の 実
行 に 必 要 な 最
小 サ イ ズ に 定
義 さ れ て い る
。 代 替 ス タ ッ
ク で シ グ ナ ル
ハ ン ド ラ ー が
起 動 さ れ た 場
合 に は 、 カ ー
ネ ル に よ り 自
動 的 に 、 ss.ss_sp で
指 定 さ れ た ア
ド レ ス は 動 作
し て い る ハ ー
ド ウ ェ ア ア ー
キ テ ク チ ャ ー
に 適 し た ア ド
レ ス 境 界 に 調
整 さ れ る 。 既
存 の ス タ ッ ク
を 無 効 に す る
に は 、 ss.ss_flags を
SS_DISABLE に 指 定 す
る 。 こ の 場 合
、 ss の 他 の フ
ィ ー ル ド は 無
視 さ れ る 。
oss
が NULL 以 外 の 場 合
、 oss に 代 替 シ
グ ナ ル ス タ ッ
ク の 情 報 が 返
さ れ る 。 こ れ
は (実 質 的 に )
sigaltstack() の 呼 び 出
し よ り 先 に 行
わ れ る 。 oss.ss_sp
と oss.ss_size フ ィ ー
ル ド に ス タ ッ
ク の 開 始 ア ド
レ ス と ス タ ッ
ク サ イ ズ が 返
さ れ る 。 oss.ss_flags
に は 以 下 の ど
ち ら か の 値 が
返 さ れ る :
SS_ONSTACK プ ロ セ ス が
代 替 シ グ ナ ル
ス タ ッ ク 上 で
実 行 さ れ て い
る (プ ロ セ ス が
既 に そ の シ グ
ナ ル ス タ ッ ク
上 で 実 行 さ れ
て い る 場 合 は
、 そ れ と 同 じ
シ グ ナ ル ス タ
ッ ク に は 変 更
で き な い 点 に
注 意 す る こ と
)。
SS_DISABLE 代 替 シ グ ナ
ル ス タ ッ ク が
現 在 無 効 に な
っ て い る 。
返 り 値
sigaltstack() は 成 功 し た 場 合 0 を 返 す 。 失 敗 し た 場 合 は −1 を 返 し て 、 エ ラ ー を 示 す 値 に errno を 設 定 す る 。
エ ラ ー
EFAULT |
ss ま た は oss の ど ち ら が 、 NULL 以 外 で 、 か つ プ ロ セ ス の ア ド レ ス 空 間 の 外 を 指 し て い る 。 | ||||||
EINVAL |
ss が NULL 以 外 で 、 ss_flags フ ィ ー ル ド が SS_DISABLE 以 外 の 0 で な い 値 に な っ て い る 。
新 し い 代 替 シ グ ナ ル ス タ ッ ク (ss.ss_size) に 指 定 し た サ イ ズ が MINSTKSZ よ り 小 さ か っ た 。 代 替 シ グ ナ ル ス タ ッ ク が 有 効 で あ る と き に 変 更 を 行 お う と し た (つ ま り 、 プ ロ セ ス が 既 に 現 在 の 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 さ れ て い た )。 準 拠SUSv2, SVr4, POSIX.1−2001. 注 意代 替 シ グ ナ ル ス タ ッ ク を 使 用 す る 最 も よ く あ る 場 面 は 、 SIGSEGV シ グ ナ ル を 扱 う と き で あ る 。 SIGSEGV は プ ロ セ ス の 通 常 の ス タ ッ ク が 利 用 で き る 空 間 が 使 い 果 た さ れ た 際 に 生 成 さ れ る シ グ ナ ル で あ る 。 こ の 場 合 に は 、 SIGSEGV 用 の シ グ ナ ル ハ ン ド ラ ー を プ ロ セ ス の ス タ ッ ク 上 で は 起 動 す る こ と が で き な い 。 そ の た め 、 こ の シ グ ナ ル を 扱 お う と す る 場 合 に は 、 代 替 シ グ ナ ル ス タ ッ ク を 使 用 し な け れ ば な ら な い 。 プ ロ セ ス が 標 準 の シ グ ナ ル ス タ ッ ク を 使 い 果 た す こ と が 予 想 さ れ る 場 合 は 、 代 替 シ グ ナ ル ス タ ッ ク を 確 立 す る と 便 利 で あ る 。 例 え ば 、 ス タ ッ ク が 最 上 位 ア ド レ ス か ら 下 位 ア ド レ ス 方 向 に 非 常 に た く さ ん 積 ま れ て し ま う こ と で 、 最 下 位 ア ド レ ス か ら 上 位 ア ド レ ス 方 向 に 積 ま れ る ヒ ー プ と ぶ つ か っ て し ま う 場 合 や 、 setrlimit(RLIMIT_STACK, &rlim) の 呼 び 出 し で 確 立 さ れ た 制 限 に 達 し て し ま っ た 場 合 に 、 こ の 様 な 事 が 起 こ る 。 標 準 の ス タ ッ ク を 使 い 果 た し て し ま う と 、 カ ー ネ ル は プ ロ セ ス に SIGSEGV シ グ ナ ル を 送 る 。 こ の よ う な 状 況 で は 、 代 替 シ グ ナ ル ス タ ッ ク 上 で し か シ グ ナ ル を キ ャ ッ チ で き な い 。 Linux が サ ポ ー ト す る 多 く の ハ ー ド ウ ェ ア ア ー キ テ ク チ ャ ー で は 、 ス タ ッ ク は 下 位 ア ド レ ス 方 向 に 積 ま れ る 。 sigaltstack() は ス タ ッ ク が 積 ま れ る 方 向 を 自 動 的 に 決 定 す る 。 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 さ れ て い る シ グ ナ ル ハ ン ド ラ ー か ら 呼 ば れ る 関 数 も 、 代 替 シ グ ナ ル ハ ン ド ラ ー を 使 う (プ ロ セ ス が 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 さ れ て い る 場 合 、 他 の シ グ ナ ル で 呼 び 出 さ れ る ハ ン ド ラ ー も こ の 代 替 シ グ ナ ル ハ ン ド ラ ー を 使 う )。 標 準 の ス タ ッ ク と は 異 な り 、 シ ス テ ム は 代 替 シ グ ナ ル ス タ ッ ク を 自 動 的 に 拡 張 し な い 。 代 替 シ グ ナ ル ス タ ッ ク 用 に 確 保 し た サ イ ズ を 越 え た 場 合 、 結 果 は 予 想 で き な い 。 execve(2) の 呼 び 出 し が 成 功 す る と 、 既 存 の 全 て の 代 替 シ グ ナ ル ス タ ッ ク が 削 除 さ れ る 。 fork(2) 経 由 で 作 成 さ れ た 子 プ ロ セ ス は 、 親 プ ロ セ ス の 代 替 シ グ ナ ル ス タ ッ ク の 設 定 の コ ピ ー を 継 承 す る 。 sigaltstack()
は 以 前 の sigstack()
を 置 き 換 え る
も の で あ る 。
過 去 プ ロ グ ラ
ム と の 互 換 性
の た め 、 glibc で は
sigstack() も 提 供 し
て い る 。 新 し
い の ア プ リ ケ
ー シ ョ ン は 全
て sigaltstack() を 使 っ
て 書 く べ き で
あ る 。 歴 史 例以 下 の コ ー ド で sigaltstack() の 使 用 法 の 一 部 を 示 す : stack_t ss; ss.ss_sp =
malloc(SIGSTKSZ); 関 連 項 目execve(2), setrlimit(2), sigaction(2), siglongjmp(3), sigsetjmp(3), signal(7) こ の 文 書 に つ い てこ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。 |