Manpages

名 前

execl, execlp, execle, execv, execvp, execvpe − フ ァ イ ル を 実 行 す る

書 式

#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...);
int execlp(const char *
file, const char *arg, ...);
int execle(const char *
path, const char *arg,
..., char * const
envp[]);
int execv(const char *
path, char *const argv[]);
int execvp(const char *
file, char *const argv[]);
int execvpe(const char *
file, char *const argv[],
char *const
envp[]);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

execvpe(): _GNU_SOURCE

説 明

exec() フ ァ ミ リ ー の 関 数 は 現 在 の プ ロ セ ス イ メ ー ジ を 新 し い プ ロ セ ス イ メ ー ジ で 置 き 換 え る 。 こ の マ ニ ュ ア ル で 説 明 さ れ て い る 関 数 は execve(2) の フ ロ ン ト エ ン ド で あ る 。 (現 在 の プ ロ セ ス イ メ ー ジ の 置 き 換 え に つ い て の 詳 細 は execve(2) の マ ニ ュ ア ル を 参 照 ) こ れ ら の 関 数 の 最 初 の 引 き 数 は 、 実 行 さ れ る フ ァ イ ル の 名 前 で あ る 。 関 数 execl(), execlp(), execle() の const char *arg と そ れ に 続 く 省 略 部 分 は arg0, arg1, ..., argn と み な さ れ る 。 こ れ ら に は 、 実 行 さ れ る プ ロ グ ラ ム で 利 用 可 能 な 引 き 数 の リ ス ト を 指 定 す る (引 き 数 の リ ス ト は ヌ ル で 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー か ら 構 成 さ れ る )。 慣 習 と し て 、 最 初 の 引 き 数 は 、 実 行 さ れ る フ ァ イ ル 名 へ の ポ イ ン タ ー に す る 。 引 き 数 の リ ス ト は 必 ず NULL で 終 わ ら な け れ ば な ら ず 、 こ れ ら の 関 数 は 可 変 長 引 き 数 関 数 な の で 、 こ の ポ イ ン タ ー は (char *) NULL と キ ャ ス ト し な け れ ば な ら な い 。 関 数 execv(), execvp(), execvpe() は 、 利 用 可 能 な 引 き 数 リ ス ト (ヌ ル で 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー の 配 列 ) を 新 し い プ ロ グ ラ ム に 渡 す 。 慣 習 と し て 、 最 初 の 引 き 数 は 実 行 さ れ る フ ァ イ ル 名 へ の ポ イ ン タ ー に す る 。 ポ イ ン タ ー の 配 列 は 必 ず NULL で 終 わ ら な け れ ば な ら な い 。 関 数 execle(), execvpe() で は 、 呼 び 出 し 元 が 引 き 数 envp 経 由 実 行 さ れ る プ ロ グ ラ ム の 環 境 を 指 定 す る こ と が で き る 。 envp 引 き 数 は 、 NULL で 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー の 配 列 で あ り 、 ヌ ル ポ イ ン タ ー で 終 わ ら な け れ ば な ら な い 。 他 の 関 数 で は 、 呼 び 出 し 元 の プ ロ セ ス の 外 部 変 数 environ か ら 新 し い プ ロ セ ス 用 の 環 境 を 与 え る 。

execlp() と execvp() の 特 別 な 動 作 関 数 execlp(), execvp(), execvpe() は 、 指 定 さ れ た フ ァ イ ル 名 が ス ラ ッ シ ュ (/) を 含 ん で い な い 場 合 、 シ ェ ル と 同 じ 動 作 で 実 行 可 能 な フ ァ イ ル を 探 索 す る 。 フ ァ イ ル の 検 索 は 、 環 境 変 数 PATH で 指 定 さ れ た コ ロ ン 区 切 り の デ ィ レ ク ト リ の パ ス 名 の リ ス ト を 対 象 に 行 わ れ る 。 こ の 変 数 が 定 義 さ れ て い な い 場 合 、 パ ス 名 の リ ス ト の デ フ ォ ル ト 値 と し て 、 カ レ ン ト デ ィ レ ク ト リ の 後 ろ に 、 confstr(_CS_PATH) が 返 す デ ィ レ ク ト リ の リ ス ト を つ な げ た 値 が 使 用 さ れ る (こ の confstr(3) の 呼 び 出 し で は 通 常 "/bin:/usr/bin" が 返 さ れ る )。 指 定 さ れ た フ ァ イ ル 名 が ス ラ ッ シ ュ を 含 む 場 合 、 PATH は 無 視 さ れ 、 指 定 さ れ た パ ス 名 の フ ァ イ ル が 実 行 さ れ る 。 さ ら に 、 い く つ か の エ ラ ー は 特 別 に 処 理 さ れ る 。 フ ァ イ ル が 実 行 フ ァ イ ル で な い 場 合 (こ の と き 呼 び 出 そ う と し た execve(2) は エ ラ ー EACCES で 失 敗 す る )、 こ れ ら の 関 数 は 残 り の 検 索 パ ス の 検 索 を 続 け る 。 他 に フ ァ イ ル が 見 つ か ら な く な っ た 場 合 errnoEACCES を 設 定 し 復 帰 す る 。 フ ァ イ ル の ヘ ッ ダ ー が 実 行 形 式 と し て 認 識 で き な い 場 合 (こ の と き 呼 び 出 そ う と し た execve(2) は エ ラ ー ENOEXEC で 失 敗 す る )、 こ れ ら の 関 数 は そ の フ ァ イ ル を 最 初 の 引 き 数 と し た シ ェ ル (/bin/sh) を 実 行 す る (こ れ に も 失 敗 し た 場 合 、 こ れ 以 上 の 検 索 は 行 わ れ な い )。

返 り 値

exec() 群 の 関 数 が 復 帰 す る の は 、 エ ラ ー が 発 生 し た 場 合 の み で あ る 。 返 り 値 は −1 で 、 errno に エ ラ ー の 内 容 が セ ッ ト さ れ る 。

エ ラ ー

こ れ ら 全 て の 関 数 は 失 敗 す る 場 合 が あ る 。 そ の 場 合 、 execve(2) に 対 し て 規 定 さ れ た エ ラ ー が errno に 設 定 さ れ る 。

バ ー ジ ョ ン

execvpe() 関 数 は glibc 2.11 で 初 め て 登 場 し た 。

準 拠

POSIX.1−2001, POSIX.1−2008.

execvpe() 関 数 は GNU に よ る 拡 張 で あ る 。

注 意

Linux 以 外 の シ ス テ ム に は 、 (環 境 変 数 PATH が 定 義 さ れ て い な い と き の ) デ フ ォ ル ト の パ ス に お い て 、 カ レ ン ト デ ィ レ ク ト リ が /bin/usr/bin の 後 ろ に 配 置 さ れ る も の も あ る 。 こ れ は ト ロ イ の 木 馬 対 策 の た め で あ る 。 Linux で は 、 デ フ ォ ル ト の パ ス に 、 昔 な が ら の 「 現 在 の デ ィ レ ク ト リ を 先 に 探 索 」 と い う ル ー ル を 使 っ て い る 。 フ ァ イ ル を 実 行 し よ う と し て い る 間 に エ ラ ー が 発 生 し た 時 の execlp() と execvp() の ふ る ま い に つ い て 歴 史 的 な 慣 習 は あ る が 、 伝 統 的 に 文 書 と し て 記 載 さ れ て お ら ず 、 POSIX 標 準 で も 規 定 さ れ て い な い 。 BSD (ま た お そ ら く 他 の シ ス テ ム ) で は 、 ETXTBSY が 発 生 し た 場 合 、 自 動 的 に 中 断 (sleep) し 再 試 行 を 行 う 。 Linux は そ れ を ハ ー ド エ ラ ー と し て 取 り 扱 い 即 座 に 復 帰 す る 。 伝 統 的 に 、 関 数 execlp() と execvp() は 、 上 で 説 明 し た エ ラ ー と 、 こ れ ら 2 つ の 関 数 自 身 が 返 す ENOMEME2BIG 以 外 の 全 て の エ ラ ー を 無 視 し て い た が 、 今 で は 、 上 で 説 明 し た 以 外 の エ ラ ー が 発 生 し た 場 合 で も 、 返 っ て く る よ う 変 更 さ れ た 。

関 連 項 目

sh(1), execve(2), execveat(2), fork(2), ptrace(2), fexecve(3), environ(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。