名 前
fexecve − フ ァ イ ル デ ィ ス ク リ プ タ ー で 指 定 さ れ た プ ロ グ ラ ム を 実 行 す る
書 式
#include <unistd.h>
int fexecve(int fd, char *const argv[], char *const envp[]);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
fexecve():
glibc 2.10 以 降 :
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
glibc 2.10 よ り 前 :
_GNU_SOURCE
説 明
fexecve() は execve(2) と 同 じ 作 業 を 行 う 。 違 う の は 、 実 行 す る フ ァ イ ル を 、 パ ス 名 で は な く 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd を 用 い て 指 定 す る 点 で あ る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー fd は 、 読 み 込 み 専 用 で オ ー プ ン さ れ て い な け れ ば な ら ず 、 呼 び 出 し 元 は フ ァ イ ル デ ィ ス ク リ プ タ ー が 参 照 す る フ ァ イ ル に 対 す る 実 行 許 可 を 持 っ て い な け れ ば な ら な い 。
返 り 値
fexecve() は 呼 び 出 し に 成 功 し た 場 合 、 戻 る こ と は な い 。 エ ラ ー の 場 合 、 返 り 値 −1 で 関 数 が 返 り 、 errno が 適 切 に 設 定 さ れ る 。
エ ラ ー
エ ラ ー は execve(2) と 同 じ だ が 、 以 下 の エ ラ ー が 追 加 に な っ て い る :
EINVAL |
fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 ま た は argv が NULL で あ る 。 ま た は envp が NULL で あ る 。 | ||
ENOSYS |
/proc フ ァ イ ル シ ス テ ム に ア ク セ ス で き な か っ た 。 |
バ ー ジ ョ ン
fexecve() は glibc 2.3.2 以 降 で 実 装 さ れ て い る 。
準 拠
POSIX.1−2008. こ の 関 数 は POSIX.1−2001 で は 規 定 さ れ て お ら ず 、 他 の シ ス テ ム で 広 く 利 用 で き る わ け で は な い 。 POSIX.1−2008 で 規 定 さ れ て い る 。
注 意
Linux で は 、 fexecve() は proc(5) フ ァ イ ル シ ス テ ム を 使 っ て 実 装 さ れ て い る 。 そ の た め 、 こ の 関 数 を 呼 び 出 す 時 点 で は /proc が マ ウ ン ト さ れ て 利 用 可 能 と な っ て い る 必 要 が あ る 。
fexecve() の 裏 に あ る 考 え は 、 呼 び 出 し 元 が 、 フ ァ イ ル を 実 行 す る 前 に 実 行 フ ァ イ ル の 内 容 を 検 査 (チ ェ ッ ク サ ム を 確 認 ) で き る よ う に す る こ と で あ る 。 単 に 、 フ ァ イ ル を オ ー プ ン し て 内 容 の チ ェ ッ ク サ ム を 検 査 し 、 そ れ か ら execve(2) を 行 う の は 十 分 で は な い 。 な ぜ な ら 、 2 つ の ス テ ッ プ の 間 で 、 フ ァ イ ル 名 や 、 パ ス 名 の デ ィ レ ク ト リ の 前 の 方 が 入 れ 換 え ら れ る 可 能 性 が あ る か ら だ (例 え ば 、 シ ン ボ リ ッ ク リ ン ク の リ ン ク 先 を 変 更 す る な ど )。 fexecve() は 、 チ ェ ッ ク サ ム の 検 査 と fexecve() の 呼 び 出 し の 間 で 、 フ ァ イ ル の 内 容 を 変 更 で き る 可 能 性 が あ る と い う 問 題 へ の 対 策 に は な ら な い 。 こ の 問 題 に 対 す る 対 応 策 は 、 確 実 に 、 フ ァ イ ル の ア ク セ ス 許 可 を 設 定 し 、 悪 意 の あ る ユ ー ザ ー が フ ァ イ ル を 変 更 で き な い よ う に す る こ と で あ る 。
fexecve() を 使 用 す る 際 の 理 に か な っ た 方 法 は 、 fd に close−on−exec フ ラ グ を セ ッ ト し 、 実 行 す る プ ロ グ ラ ム を 通 じ て そ の フ ァ イ ル デ ィ ス ク リ プ タ ー が 外 部 に も れ な い よ う に す る こ と で あ る 。 こ の 方 法 は 2 つ の 理 由 か ら 理 に か な っ て い る 。 1 つ 目 は 、 こ れ に よ り 不 必 要 に フ ァ イ ル デ ィ ス ク リ プ タ ー が 消 費 さ れ る の を 防 ぐ こ と が で き る (実 行 さ れ る プ ロ グ ラ ム は 普 通 プ ロ グ ラ ム 自 身 が 参 照 す る フ ァ イ ル を 参 照 す る 必 要 は な い )。 2 つ 目 は 、 fexecve() が 再 帰 的 に 使 用 さ れ た 場 合 、 close−on−exec フ ラ グ を 利 用 す る こ と で 、 再 帰 の 各 ス テ ッ プ で 新 し い プ ロ グ ラ ム に 一 つ 余 計 に フ ァ イ ル デ ィ ス ク リ プ タ ー が 渡 さ れ る こ と に よ る 、 フ ァ イ ル デ ィ ス ク リ プ タ ー の 枯 渇 を 防 ぐ こ と が で き る (た だ し 「 バ グ 」 を 参 照 )。
バ グ
fd が ス ク リ プ ト を 参 照 し て い て (つ ま り 、 最 初 の 行 に 文 字 #! で 始 ま る ス ク リ プ ト イ ン タ ー プ リ タ ー の 指 示 が あ る 実 行 テ キ ス ト フ ァ イ ル で あ る )、 fd に close−on−exec フ ラ グ が セ ッ ト さ れ て い た 場 合 、 fexecve() は エ ラ ー ENOENT で 失 敗 す る 。 こ の エ ラ ー が 起 こ る の は 、 ス ク リ プ ト イ ン タ ー プ リ タ ー が 実 行 さ れ る 時 点 ま で に 、 close−on−exec フ ラ グ に よ り fd が す で に ク ロ ー ズ さ れ て し ま っ て い る か ら で あ る 。 そ の た め 、 ス ク リ プ ト を 参 照 す る 場 合 に は 、 close−on−exec フ ラ グ を fd に セ ッ ト す る こ と は で き ず 、 「 注 意 」 の 節 で 説 明 さ れ て い る 問 題 が 起 こ り 得 る 。
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。