Manpages

名 前

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_spss.ss_size に ス タ ッ ク の 開 始 ア ド レ ス と ス タ ッ ク サ イ ズ を 指 定 す る 。 定 数 SIGSTKSZ は 、 代 替 シ グ ナ ル ス タ ッ ク が 通 常 必 要 す る サ イ ズ よ り も 充 分 大 き く 定 義 さ れ て い る 。 ま た 定 数 MINSIGSTKSZ は 、 シ グ ナ ル ハ ン ド ラ ー の 実 行 に 必 要 な 最 小 サ イ ズ に 定 義 さ れ て い る 。 代 替 ス タ ッ ク で シ グ ナ ル ハ ン ド ラ ー が 起 動 さ れ た 場 合 に は 、 カ ー ネ ル に よ り 自 動 的 に 、 ss.ss_sp で 指 定 さ れ た ア ド レ ス は 動 作 し て い る ハ ー ド ウ ェ ア ア ー キ テ ク チ ャ ー に 適 し た ア ド レ ス 境 界 に 調 整 さ れ る 。 既 存 の ス タ ッ ク を 無 効 に す る に は 、 ss.ss_flagsSS_DISABLE に 指 定 す る 。 こ の 場 合 、 ss の 他 の フ ィ ー ル ド は 無 視 さ れ る 。

oss が NULL 以 外 の 場 合 、 oss に 代 替 シ グ ナ ル ス タ ッ ク の 情 報 が 返 さ れ る 。 こ れ は (実 質 的 に ) sigaltstack() の 呼 び 出 し よ り 先 に 行 わ れ る 。 oss.ss_sposs.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 で な い 値 に な っ て い る 。

ENOMEM

新 し い 代 替 シ グ ナ ル ス タ ッ ク (ss.ss_size) に 指 定 し た サ イ ズ が MINSTKSZ よ り 小 さ か っ た 。

EPERM

代 替 シ グ ナ ル ス タ ッ ク が 有 効 で あ る と き に 変 更 を 行 お う と し た (つ ま り 、 プ ロ セ ス が 既 に 現 在 の 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 さ れ て い た )。

準 拠

SUSv2, SVr4, POSIX.1−2001.

注 意

代 替 シ グ ナ ル ス タ ッ ク を 使 用 す る 最 も よ く あ る 場 面 は 、 SIGSEGV シ グ ナ ル を 扱 う と き で あ る 。 SIGSEGV は プ ロ セ ス の 通 常 の ス タ ッ ク が 利 用 で き る 空 間 が 使 い 果 た さ れ た 際 に 生 成 さ れ る シ グ ナ ル で あ る 。 こ の 場 合 に は 、 SIGSEGV 用 の シ グ ナ ル ハ ン ド ラ ー を プ ロ セ ス の ス タ ッ ク 上 で は 起 動 す る こ と が で き な い 。 そ の た め 、 こ の シ グ ナ ル を 扱 お う と す る 場 合 に は 、 代 替 シ グ ナ ル ス タ ッ ク を 使 用 し な け れ ば な ら な い 。 プ ロ セ ス が 標 準 の シ グ ナ ル ス タ ッ ク を 使 い 果 た す こ と が 予 想 さ れ る 場 合 は 、 代 替 シ グ ナ ル ス タ ッ ク を 確 立 す る と 便 利 で あ る 。 例 え ば 、 ス タ ッ ク が 最 上 位 ア ド レ ス か ら 下 位 ア ド レ ス 方 向 に 非 常 に た く さ ん 積 ま れ て し ま う こ と で 、 最 下 位 ア ド レ ス か ら 上 位 ア ド レ ス 方 向 に 積 ま れ る ヒ ー プ と ぶ つ か っ て し ま う 場 合 や 、 setrlimit(RLIMIT_STACK, &rlim) の 呼 び 出 し で 確 立 さ れ た 制 限 に 達 し て し ま っ た 場 合 に 、 こ の 様 な 事 が 起 こ る 。 標 準 の ス タ ッ ク を 使 い 果 た し て し ま う と 、 カ ー ネ ル は プ ロ セ ス に SIGSEGV シ グ ナ ル を 送 る 。 こ の よ う な 状 況 で は 、 代 替 シ グ ナ ル ス タ ッ ク 上 で し か シ グ ナ ル を キ ャ ッ チ で き な い 。

Linux が サ ポ ー ト す る 多 く の ハ ー ド ウ ェ ア ア ー キ テ ク チ ャ ー で は 、 ス タ ッ ク は 下 位 ア ド レ ス 方 向 に 積 ま れ る 。 sigaltstack() は ス タ ッ ク が 積 ま れ る 方 向 を 自 動 的 に 決 定 す る 。 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 さ れ て い る シ グ ナ ル ハ ン ド ラ ー か ら 呼 ば れ る 関 数 も 、 代 替 シ グ ナ ル ハ ン ド ラ ー を 使 う (プ ロ セ ス が 代 替 シ グ ナ ル ス タ ッ ク 上 で 実 行 さ れ て い る 場 合 、 他 の シ グ ナ ル で 呼 び 出 さ れ る ハ ン ド ラ ー も こ の 代 替 シ グ ナ ル ハ ン ド ラ ー を 使 う )。 標 準 の ス タ ッ ク と は 異 な り 、 シ ス テ ム は 代 替 シ グ ナ ル ス タ ッ ク を 自 動 的 に 拡 張 し な い 。 代 替 シ グ ナ ル ス タ ッ ク 用 に 確 保 し た サ イ ズ を 越 え た 場 合 、 結 果 は 予 想 で き な い 。

execve(2) の 呼 び 出 し が 成 功 す る と 、 既 存 の 全 て の 代 替 シ グ ナ ル ス タ ッ ク が 削 除 さ れ る 。 fork(2) 経 由 で 作 成 さ れ た 子 プ ロ セ ス は 、 親 プ ロ セ ス の 代 替 シ グ ナ ル ス タ ッ ク の 設 定 の コ ピ ー を 継 承 す る 。

sigaltstack() は 以 前 の sigstack() を 置 き 換 え る も の で あ る 。 過 去 プ ロ グ ラ ム と の 互 換 性 の た め 、 glibc で は sigstack() も 提 供 し て い る 。 新 し い の ア プ リ ケ ー シ ョ ン は 全 て sigaltstack() を 使 っ て 書 く べ き で あ る 。 歴 史
4.2BSD に は sigstack() シ ス テ ム コ ー ル が あ っ た 。 こ の 関 数 は 少 し 異 な っ た 構 造 体 を 使 っ て お り 、 呼 び 出 し た 側 が ス タ ッ ク の 積 ま れ る 方 向 を 知 っ て い な け れ ば な ら な い と い う 大 き な 欠 点 が あ っ た 。

以 下 の コ ー ド で sigaltstack() の 使 用 法 の 一 部 を 示 す :

stack_t ss;

ss.ss_sp = malloc(SIGSTKSZ);
if (ss.ss_sp == NULL)
/* ハ ン ド ル エ ラ ー */;
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) == −1)
/* ハ ン ド ル エ ラ ー */;

関 連 項 目

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/ に 書 か れ て い る 。