名 前
execveat − デ ィ レ ク ト リ フ ァ イ ル デ ィ ス ク リ プ タ ー か ら の 相 対 パ ス で 指 定 さ れ る プ ロ グ ラ ム を 実 行 す る
書 式
#include <unistd.h>
int
execveat(int dirfd, const char
*pathname,
char *const argv[], char *const
envp[],
int flags);
説 明
execveat() シ ス テ ム コ ー ル は dirfd と pathname の 組 み 合 わ せ で 参 照 さ れ る プ ロ グ ラ ム を 実 行 す る 。 execve(2) と 全 く 同 様 に 動 作 す る が 、 以 下 で 説 明 す る 点 が 異 な る 。
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 こ の パ ス 名 は フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る (execve(2) に 相 対 パ ス 名 を 渡 し た 場 合 の よ う に 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス で は な い )。
pathname で 指 定 さ れ た パ ス 名 が 相 対 パ ス で 、 dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 (execve(2) と 同 様 に ) pathname は 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 対 す る 相 対 パ ス と 解 釈 さ れ る 。
pathname で 指 定 さ れ た パ ス 名 が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。
pathname が 空 文 字 列 で 、 AT_EMPTY_PATH フ ラ グ が 指 定 さ れ て い る 場 合 、 フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd は 実 行 す る フ ァ イ ル を 指 定 す る (す な わ ち dirfd は デ ィ レ ク ト リ で は な く 実 行 フ ァ イ ル を 参 照 す る )。
flags
引 き 数 は 、 以
下 に 示 す 値 の 0
個 以 上 を 指 定
で き る ビ ッ ト
マ ス ク で あ る
。
AT_EMPTY_PATH
pathname が 空 文 字 列 の 場 合 、 dirfd が 参 照 す る フ ァ イ ル に 対 し て 動 作 を 行 う (dirfd は open(2() O_PATH フ ラ グ を 使 っ て 取 得 で き る )。
AT_SYMLINK_NOFOLLOW
dirfd と NULL で な い pathname で 指 定 さ れ た フ ァ イ ル が シ ン ボ リ ッ ク リ ン ク の 場 合 、 呼 び 出 し は エ ラ ー ELOOP で 失 敗 す る 。
返 り 値
成 功 す る と execveat() は 返 ら な い 。 エ ラ ー の 場 合 は −1 を 返 し 、 errno を 適 切 に 設 定 す る 。
エ ラ ー
execve() で 発 生 す る の と 同 じ エ ラ ー が execveat() で も 起 こ る 。 execveat() で は 以 下 の エ ラ ー も 発 生 す る 。
EBADF |
dirfd が 適 切 な フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。 | ||
EINVAL |
flags に 無 効 な フ ラ グ が 指 定 さ れ た 。 | ||
ELOOP |
flags に AT_SYMLINK_NOFOLLOW が 指 定 さ れ て い て 、 dirfd と NULL で な い pathname で 指 定 さ れ た フ ァ イ ル が シ ン ボ リ ッ ク リ ン ク で あ る 。 | ||
ENOENT |
dirfd と pathname で 指 定 さ れ る プ ロ グ ラ ム は イ ン タ ー プ リ タ ー プ ロ グ ラ ム を 使 用 す る 必 要 が あ る が (例 え ば "#!" で 始 ま る ス ク リ プ ト )、 フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が O_CLOEXEC フ ラ グ 付 き で オ ー プ ン さ れ て お り 、 そ の 結 果 プ ロ グ ラ ム フ ァ イ ル は 起 動 さ れ た イ ン タ ー プ リ タ ー に ア ク セ ス で き な い こ と に な る 。 「 バ グ 」 を 参 照 。 |
ENOTDIR
pathname が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。
バ ー ジ ョ ン
execveat() は バ ー ジ ョ ン 3.19 で Linux に 追 加 さ れ た 。 GNU C ラ イ ブ ラ リ に よ る サ ポ ー ト は 検 討 中 で あ る 。
準 拠
execveat() シ ス テ ム コ ー ル は Linux 固 有 で あ る 。
注 意
openat(2) で 説 明 さ れ て い る 理 由 に 加 え 、 execveat() シ ス テ ム コ ー ル は 、 fexecve(3) を /proc フ ァ イ ル シ ス テ ム が マ ウ ン ト さ れ て い な い シ ス テ ム で 実 装 す る た め に も 必 要 で あ る 。 ス ク リ プ ト フ ァ イ ル を 実 行 す る よ う に 要 求 さ れ た 際 、 ス ク リ プ ト イ ン タ ー プ リ タ ー に 渡 さ れ る argv[0] は 、 /dev/fd/N 形 式 ま た は /dev/fd/N/P 形 式 の 文 字 列 で あ る 。 こ こ で N は dirfd 引 き 数 で 渡 さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー 数 で あ る 。 最 初 の 形 式 の 文 字 列 と な る の は 、 AT_EMPTY_PATH が 使 用 さ れ た 場 合 で あ る 。 2 番 目 の 形 式 の 文 字 列 に な る の は 、 ス ク リ プ ト が dirfd と pathname の 両 方 を 使 っ て 指 定 さ れ た 場 合 で あ る 。 こ の と き P は pathname に 指 定 さ れ た 値 で あ る 。
fexecve(3) で 説 明 さ れ て い る の と 同 じ 理 由 で 、 execveat(2) を 使 う 際 の 理 に か な っ た 方 法 は dirfd に close−on−exec フ ラ グ を セ ッ ト す る こ と で あ る (た だ し 「 バ グ 」 を 参 照 の こ と )。
バ グ
上 記 で 説 明 し た エ ラ ー ENOENT は 、 以 下 の 形 式 の 呼 び 出 し に 渡 す フ ァ イ ル デ ィ ス ク リ プ タ ー で close−on−exec フ ラ グ を セ ッ ト で き な い こ と を 意 味 し て い る 。
execveat(fd, "", argv, envp, AT_EMPTY_PATH); し か し な が ら 、 close−on−exec フ ラ グ を セ ッ ト で き な い と い う こ と は 、 ス ク リ プ ト を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー は ス ク リ プ ト 自 身 に 見 え て し ま う と い う こ と で あ る 。 フ ァ イ ル デ ィ ス ク リ プ タ ー を 無 駄 に 使 う だ け で な く 、 フ ァ イ ル デ ィ ス ク リ プ タ ー が 見 え て し ま う こ と に よ り 、 ス ク リ プ ト が execveat() を 再 帰 的 に 利 用 す る 状 況 で は フ ァ イ ル デ ィ ス ク リ プ タ ー の 枯 渇 に つ な が る 可 能 性 が あ る 。
関 連 項 目
execve(2), openat(2), fexecve(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。