Manpages

名 前

execve − プ ロ グ ラ ム を 実 行 す る

書 式

#include <unistd.h>

int execve(const char *filename, char *const argv[],
char *const
envp[]);

説 明

execve() は 、 filename に よ っ て 指 定 さ れ た プ ロ グ ラ ム を 実 行 す る 。 filename は 、 バ イ ナ リ 実 行 形 式 か 、 以 下 の 形 式 の 行 で 始 ま る ス ク リ プ ト で な け れ ば な ら な い 。

#! interpreter [optional−arg] 後 者 の 詳 細 は 、 後 ろ の 「 イ ン タ ー プ リ タ ー ス ク リ プ ト 」 の 節 を 参 照 の こ と 。

argv は 新 し い プ ロ グ ラ ム に 渡 さ れ る 引 き 数 文 字 列 の 配 列 で あ る 。 慣 例 で は 、 引 き 数 文 字 列 の 最 初 の 要 素 に は 実 行 さ れ た フ ァ イ ル に 関 連 付 け ら れ た フ ァ イ ル 名 を 含 め る こ と に な っ て い る 。 envp は 文 字 列 の 配 列 で あ り 、 伝 統 的 に key=value の 形 式 を し て お り 、 新 し い プ ロ グ ラ ム の 環 境 変 数 と し て 渡 さ れ る 。 argvenvp は い ず れ も の ヌ ル ポ イ ン タ ー で 終 わ っ て い る 必 要 が あ る 。 引 き 数 配 列 と 環 境 変 数 は 、 呼 び 出 さ れ た プ ロ グ ラ ム の main 関 数 を 以 下 の よ う に 定 義 す る こ と に よ っ て ア ク セ ス 可 能 に な る 。

int main(int argc, char *argv[], char *envp[]) 成 功 し た 場 合 、 execve() は 返 ら な い 。 そ し て 、 呼 び 出 し 元 の プ ロ セ ス の text, data, bss, ス タ ッ ク は 、 読 み 込 ま れ た プ ロ グ ラ ム に よ っ て 上 書 き さ れ る 。 元 の プ ロ グ ラ ム が ptrace さ れ て い る 場 合 、 execve() が 成 功 し た 後 に そ の プ ロ グ ラ ム に SIGTRAP が 送 ら れ る 。

filename で 指 定 さ れ た プ ロ グ ラ ム フ ァ イ ル に set−user−ID ビ ッ ト が 設 定 さ れ て お り 、 フ ァ イ ル が 存 在 す る フ ァ イ ル シ ス テ ム が nosuid (mount(2) の MS_NOSUID フ ラ グ ) で マ ウ ン ト さ れ て お ら ず 、 呼 び 出 し た プ ロ セ ス が ptrace さ れ て い な い 場 合 、 呼 び 出 し た プ ロ セ ス の 実 効 (effective) ユ ー ザ ー ID は プ ロ グ ラ ム フ ァ イ ル の 所 有 者 (owner) に 変 更 さ れ る 。 同 様 に 、 プ ロ グ ラ ム フ ァ イ ル に set−group−ID ビ ッ ト が 設 定 さ れ て い た 場 合 、 呼 び 出 し た プ ロ セ ス の 有 効 グ ル ー プ ID は プ ロ グ ラ ム フ ァ イ ル の グ ル ー プ に 変 更 さ れ る 。 プ ロ セ ス の 実 効 ユ ー ザ ー ID は 保 存 (saved) set−user−ID に コ ピ ー さ れ る 。 同 様 に 、 実 効 グ ル ー プ ID は 保 存 set−group−ID に コ ピ ー さ れ る 。 こ の コ ピ ー は 、 set−user−ID / set−group−ID 許 可 ビ ッ ト に よ り 発 生 す る 実 効 ID の 変 更 後 に 行 わ れ る 。 実 行 フ ァ イ ル が 動 的 リ ン ク さ れ た a.out 実 行 形 式 で 、 共 有 ラ イ ブ ラ リ の ス タ ブ を 含 む も の だ っ た 場 合 、 実 行 の 開 始 時 に Linux の ダ イ ナ ミ ッ ク リ ン カ ー ld.so(8) が 呼 び 出 さ れ 、 必 要 な 共 有 ラ イ ブ ラ リ を メ モ リ ー に 読 み 込 ん で リ ン ク を 行 う 。 実 行 フ ァ イ ル が ダ イ ナ ミ ッ ク リ ン ク さ れ た ELF 実 行 形 式 だ っ た 場 合 、 PT_INTERP セ グ メ ン ト に 指 定 さ れ た イ ン タ ー プ リ タ ー が 必 要 な 共 有 ラ イ ブ ラ リ (shared library) を 読 み 込 む の に 使 用 さ れ る 。 通 常 、 イ ン タ ー プ リ タ ー は glibc を リ ン ク し た バ イ ナ リ で は /lib/ld−linux.so.2 で あ る 。 以 下 に 示 す 以 外 の す べ て の プ ロ セ ス 属 性 は execve() の 前 後 で 保 持 さ れ る 。

* 捕 捉 さ れ た シ グ ナ ル の 処 理 方 法

(disposition) は デ フ ォ ル ト 動 作 に リ セ ッ

ト さ れ る (signal(7))。

* 代 替 シ グ ナ ル ス タ ッ ク は ど れ も 保 持 さ れ な い

(sigaltstack(2))。

* メ モ リ ー マ ッ ピ ン グ は 保 持 さ れ な い

(mmap(2))。

* 付 加 さ れ た

(attached) System V 共 有 メ モ リ ー セ グ メ ン ト は 分 離 さ れ る

(shmat(2))。

*

POSIX 共 有 メ モ リ ー 領 域 は マ ッ ピ ン グ を 解 除 さ れ る (shm_open(3))。

*

オ ー プ ン さ れ た POSIX メ ッ セ ー ジ キ ュ ー デ ィ ス ク リ プ タ ー は ク ロ ー ズ さ れ る (mq_overview(7))。

*

オ ー プ ン さ れ た POSIX 名 前 付 き セ マ フ ォ は い ず れ も ク ロ ー ズ さ れ る (sem_overview(7))。
*

POSIX タ イ マ ー は 保 持 さ れ な い (timer_create(2))。

*

オ ー プ ン さ れ た デ ィ レ ク ト リ ス ト リ ー ム は い ず れ も ク ロ ー ズ さ れ る (opendir(3))。

*

メ モ リ ー ロ ッ ク は 保 持 さ れ な い (mlock(2), mlockall(2))。
* 終 了 (exit) ハ ン ド ラ ー は 保 持 さ れ な い (atexit(3), on_exit(3))。

* 浮 動 小

数 点 関 連 の 環 境 は デ フ ォ ル ト に リ セ ッ ト さ れ る (fenv(3) 参 照 )。 上 記 の リ ス ト の プ ロ セ ス 属 性 は い ず れ も POSIX.1−2001 で 規 定 さ れ て い る 。 以 下 に 示 す Linux 固 有 の プ ロ セ ス 属 性 も execve() の 前 後 で 保 持 さ れ な い 。

*

set−user−ID か set−group−ID さ れ た プ ロ グ ラ ム が 実 行 さ れ て い る 場 合 、 prctl(2)PR_SET_DUMPABLE フ ラ グ は ク リ ア さ れ る 。 そ れ 以 外 の 場 合 、 こ の フ ラ グ は セ ッ ト さ れ る 。

*

prctl(2)PR_SET_KEEPCAPS フ ラ グ は ク リ ア さ れ る 。

*

(Linux 2.4.36 以 降 / 2.6.23 以 降 ) set−user−ID や set−group−ID さ れ た プ ロ グ ラ ム が 実 行 さ れ た 場 合 、 prctl(2)PR_SET_PDEATHSIG フ ラ グ で 設 定 さ れ た parent death シ グ ナ ル は ク リ ア さ れ る 。

*

プ ロ セ ス 名 は 新 し い 実 行 フ ァ イ ル の 名 前 に リ セ ッ ト さ れ る 。 プ ロ セ ス 名 は prctl(2)PR_SET_NAME で 設 定 で き 、 ps −o comm で 表 示 で き る 。
*

SECBIT_KEEP_CAPSsecurebits フ ラ グ は ク リ ア さ れ る 。 capabilities(7) 参 照 。

*

終 了 シ グ ナ ル (termination signal) は SIGCHLD に リ セ ッ ト さ れ る (clone(2) 参 照 )。 以 下 の 点 に つ い て も 注 意 す る こ と :

* 呼 び 出 し 元 ス レ ッ ド 以 外 の 全 て の ス レ ッ ド は

execve() 中 に 破 棄 さ れ る 。 mutex、 条 件 変 数 、 そ の 他 の pthread オ ブ ジ ェ ク ト は 保 持 さ れ な い 。

*

setlocale(LC_ALL, "C") 相 当 の 処 理 が プ ロ グ ラ ム 開 始 時 に 実 行 さ れ る 。

*

POSIX.1−2001 は 、 動 作 が 無 視 か デ フ ォ ル ト に 設 定 さ れ て い る 全 て の シ グ ナ ル の 処 理 方 法 は 変 更 せ ず そ の ま ま に す る 、 と 規 定 し て い る 。 但 し 、 POSIX.1−2001 に は 一 つ 例 外 が あ り 、 SIGCHLD が 無 視 に な っ て い る 場 合 、 そ の 処 理 方 法 を 変 更 せ ず に そ の ま ま に す る か 、 デ フ ォ ル ト 動 作 に リ セ ッ ト す る か は 実 装 依 存 と な っ て い る 。 Linux で は 前 者 (変 更 し な い ) と な っ て い る 。

*

完 了 し て い な い 非 同 期 I/O 操 作 は キ ャ ン セ ル さ れ る (aio_read(3), aio_write(3))。
*

execve(2) 時 の ケ ー パ ビ リ テ ィ の 扱 い に つ い て は 、 capabilities(7) を 参 照 。

*

デ フ ォ ル ト で は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー は execve() を 行 っ た 後 で も オ ー プ ン さ れ た ま ま で あ る 。 close−on−exec の 印 が 付 い て い る フ ァ イ ル デ ィ ス ク リ プ タ ー は ク ロ ー ズ さ れ る 。 fcntl(2)FD_CLOEXEC の 説 明 を 参 照 。 (フ ァ イ ル デ ィ ス ク リ プ タ ー が ク ロ ー ズ さ れ る と 、 こ の プ ロ セ ス が フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 応 す る フ ァ イ ル に 対 し て 獲 得 し て い た レ コ ー ド の ロ ッ ク が 全 て 解 放 さ れ る こ と に な る 。 ) POSIX.1−2001 で は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー 0, 1, 2 が execve() 成 功 後 に ど こ か で ク ロ ー ズ さ れ 、 か つ 実 行 さ れ る フ ァ イ ル に set−user_ID か set−group_ID の 許 可 ビ ッ ト が セ ッ ト さ れ て い て プ ロ セ ス が 特 権 を 獲 得 し た 場 合 、 シ ス テ ム は 何 ら か の フ ァ イ ル を オ ー プ ン す る 際 に こ れ ら の 番 号 の デ ィ ス ク リ プ タ ー の ど れ か を 使 う こ と が あ る 、 と さ れ て い る 。 原 則 と し て 、 移 植 性 が 必 要 な プ ロ グ ラ ム で は 、 特 権 の 有 無 に 関 わ ら ず 、 execve() の 前 後 で こ れ ら 3つ の フ ァ イ ル デ ィ ス ク リ プ タ ー が ク ロ ー ズ さ れ た ま ま で あ る こ と を 前 提 に す る こ と は で き な い 。 イ ン タ ー プ リ タ ー ス ク リ プ ト イ ン タ ー プ リ タ ー ス ク リ プ ト と は 、 実 行 許 可 が 有 効 に な っ て い て 、 最 初 の 行 が 以 下 の 形 に な っ て い る テ キ ス ト フ ァ イ ル の こ と で あ る 。

#! interpreter [optional−arg]

interpreter は 有 効 な 実 行 フ ァ イ ル の パ ス 名 で な け れ ば な ら ず 、 そ れ 自 身 が ス ク リ プ ト で あ っ て は な ら な い 。 execve() の filename 引 き 数 が イ ン タ ー プ リ タ ー ス ク リ プ ト を 指 定 し て い る 場 合 、 interpreter は 以 下 の 引 き 数 で 起 動 さ れ る 。

interpreter [optional−arg] filename arg...

arg... は 、 execve() の argv 引 き 数 が 指 す ワ ー ド 列 で あ る 。 argv[1] か ら 始 ま る 。 移 植 性 を 持 た す に は 、 optional−arg は 空 か 1ワ ー ド だ け に す べ き で あ る (つ ま り 、 ホ ワ イ ト ス ペ ー ス を 含 め る べ き で は な い )。 下 記 の 「 注 意 」 の 節 を 参 照 。 引 き 数 と 環 境 変 数 の 合 計 サ イ ズ の 上 限 ほ と ん ど の UNIX の 実 装 は 、 新 し い プ ロ グ ラ ム に 渡 す こ と が で き る コ マ ン ド ラ イ ン 引 き 数 (argv) と 環 境 変 数 (envp) の 文 字 列 群 の 合 計 サ イ ズ に 何 ら か の 上 限 を 設 け て い る 。 POSIX.1 は 、 ARG_MAX 定 数 を 使 っ て こ の 上 限 を 決 め る 実 装 を 認 め て い る (ARG_MAX<limits.h> で 定 義 さ れ る か 、 実 行 時 に sysconf(_SC_ARG_MAX) の 呼 び 出 し で 入 手 で き る か の い ず れ か で あ る )。 カ ー ネ ル 2.6.23 よ り 前 の Linux で は 、 環 境 変 数 と 引 き 数 の 文 字 列 群 を 格 納 す る の に 使 用 さ れ る メ モ リ ー は 32 ペ ー ジ に 制 限 さ れ て い た (32 ペ ー ジ と い う の は カ ー ネ ル 定 数 MAX_ARG_PAGES で 定 義 さ れ る )。 し た が っ て 、 ペ ー ジ サ イ ズ が 4 kB の ア ー キ テ ク チ ャ ー で は 、 最 大 サ イ ズ は 128 kB と い う こ と に な る 。 カ ー ネ ル 2.6.23 以 降 で は 、 ほ と ん ど の ア ー キ テ ク チ ャ ー に お い て 、 execve() が 呼 び 出 さ れ た 時 点 で 適 用 さ れ て い る リ ソ ー ス の ソ フ ト 上 限 RLIMIT_STACK に 基 づ い た サ イ ズ 上 限 が 使 わ れ る (メ モ リ ー 管 理 ユ ニ ッ ト (MMU) を 持 た な い ア ー キ テ ク チ ャ ー は 上 記 の 変 更 の 例 外 で あ り 、 こ れ ら の ア ー キ テ ク チ ャ ー で は カ ー ネ ル 2.6.23 よ り 前 と 同 じ 上 限 が そ の ま ま 使 用 さ れ る )。 こ れ ら の ア ー キ テ ク チ ャ ー で は 、 合 計 サ イ ズ は 許 可 さ れ た ス タ ッ ク サ イ ズ の 1/4 に 制 限 さ れ て い る (1/4 の 上 限 を 設 け て い る の は 、 新 し い プ ロ グ ラ ム が 必 ず あ る 程 度 の ス タ ッ ク 空 間 を 持 て る こ と を 保 証 す る た め で あ る )。 Linux 2.6.25 以 降 で は 、 カ ー ネ ル は こ の サ イ ズ 上 限 に 32 ペ ー ジ の 下 限 を 設 け て い る 。 こ れ に よ り 、 RLIMIT_STACK が 非 常 に 小 さ く 設 定 さ れ た 場 合 で も 、 ア プ リ ケ ー シ ョ ン が 少 な く と も Linux 2.6.23 以 前 で 提 供 さ れ て い た の と 同 じ 大 き さ の 引 き 数 と 環 境 変 数 の 空 間 と 同 じ だ け は 確 保 で き る こ と が 保 証 さ れ て い る (こ の 最 低 限 の 保 証 は Linux 2.6.23 と 2.6.24 で は 提 供 さ れ て い な い )。 ま た 、 各 文 字 列 の 上 限 は 32 ペ ー ジ (カ ー ネ ル 定 数 MAX_ARG_STRLEN) で 、 文 字 列 数 の 最 大 値 は 0x7FFFFFFF で あ る 。

返 り 値

成 功 す る と execve() は 返 ら な い 。 エ ラ ー の 場 合 は −1 を 返 し 、 errno を 適 切 に 設 定 す る 。

エ ラ ー

E2BIG 環 境 変 数

(envp) と 引 き 数 リ ス ト (argv) の 合 計 バ イ ト 数 が 大 き 過 ぎ

る 。

EACCES

filename や ス ク リ プ ト イ ン タ ー プ リ タ ー 名 の 構 成 要 素 に 検 索 許 可 (search permission) が 与 え ら れ て い な い (path_resolution(7) も 参 照 す る こ と )。

EACCES

フ ァ イ ル も し く は ス ク リ プ ト の イ ン タ ー プ リ タ ー が 通 常 フ ァ イ ル (regular file) で な い 。

EACCES

フ ァ イ ル や ス ク リ プ ト や ELF イ ン タ ー プ リ タ ー に 実 行 許 可 (execute permission) が 与 え ら れ て い な い 。

EACCES

フ ァ イ ル シ ス テ ム が noexec で マ ウ ン ト さ れ て い る 。

EAGAIN (Linux 3.1 以 降 )

set*uid() の い ず れ か の 呼 び 出 し で プ ロ セ ス の 実 UID が 変 更 さ れ た と す る と 、 呼 び 出 し 元 の RLIMIT_NPROC リ ソ ー ス 上 限 (setrlimit(2) 参 照 ) を 超 え て し ま う 、 現 在 も ま だ 超 え て い る 。 こ の エ ラ ー の 詳 細 な 説 明 に つ い て は 「 注 意 」 の 節 を 参 照 。

EFAULT

filename ま た は 配 列 argvenvp の ポ イ ン タ ー の 一 つ が ア ク セ ス 可 能 な ア ド レ ス 空 間 の 外 を 指 し て い る 。

EINVAL

ELF 実 行 形 式 で 複 数 の PT_INTERP セ グ メ ン ト が 存 在 す る 。 (す な わ ち 複 数 の イ ン タ ー プ リ タ ー を 指 定 し た 。 )

EIO

I/O エ ラ ー が 発 生 し た 。

EISDIR

ELF イ ン タ ー プ リ タ ー が デ ィ レ ク ト リ だ っ た 。

ELIBBAD

ELF イ ン タ ー プ リ タ ー が 理 解 で き る フ ォ ー マ ッ ト で な か っ た 。

ELOOP

filename や ス ク リ プ ト や ELF の イ ン タ ー プ リ タ ー を 解 決 す る 際 に 遭 遇 し た シ ン ボ リ ッ ク リ ン ク が 多 過 ぎ る 。

EMFILE

そ の プ ロ セ ス が オ ー プ ン で き る フ ァ イ ル 数 の 上 限 ま で 既 に オ ー プ ン し て い る 。

ENAMETOOLONG

filename が 長 過 ぎ る 。

ENFILE オ ー プ ン さ れ た フ ァ イ ル の 総 数 が シ ス テ ム 全 体 の 上 限 に 達 し て い た 。

ENOENT フ ァ イ ル

filename か ス ク リ プ ト や ELF の イ ン タ ー プ リ タ ー が 存 在 し な い 。
ENOEXEC
実 行 フ ァ イ ル が 理 解 で き な い 形 式 で あ る か 、 違 う ア ー キ テ ク チ ャ ー の も の か 、 そ の 他 の フ ォ ー マ ッ ト エ ラ ー に よ り 実 行 が で き な か っ た 。

ENOMEM カ ー ネ ル に 十 分 な メ モ リ ー が な い 。

ENOTDIR

filename や ス ク リ プ ト や ELF の イ ン タ ー プ リ タ ー の 構 成 要 素 が デ ィ レ ク ト リ で な い 。

EPERM フ ァ イ ル シ ス テ ム が

nosuid で マ ウ ン ト さ れ 、 ユ ー ザ ー が ス ー パ ー ユ ー

ザ ー で な く 、 フ ァ イ ル に set−user−ID あ る い は set−group−ID ビ ッ ト が 設 定 さ れ て い る 。

EPERM プ ロ セ ス が ト レ ー ス さ れ 、 ユ ー ザ ー が ス ー パ ー ユ ー ザ ー で な く 、 フ ァ イ ル に

set−user−ID あ る い は set−group−ID ビ ッ ト が 設 定 さ れ て い る 。
ETXTBSY
実 行 フ ァ イ ル を 書 き 込 み 用 に オ ー プ ン し て い る プ ロ セ ス が あ る 。

準 拠

SVr4, 4.3BSD, POSIX.1−2001. POSIX.1−2001 に は #! 動 作 に つ い て の 記 述 は な い が 、 他 は 互 換 性 が あ る 。

注 意

set−user−id プ ロ セ ス と set−group−ID プ ロ セ ス は ptrace(2) で き な い 。 フ ァ イ ル シ ス テ ム を nosuid で マ ウ ン ト し た 場 合 に set−user−ID/set−group−ID の 実 行 フ ァ イ ル を ど の 様 に 扱 う か は 、 Linux カ ー ネ ル の バ ー ジ ョ ン に よ っ て 異 な る : あ る バ ー ジ ョ ン で は 、 す で に 必 要 な 権 限 を 持 っ て い る 場 合 を 除 い て 、 そ の 実 行 を 拒 否 す る (そ し て EPERM を 返 す )。 別 の あ る バ ー ジ ョ ン で は set−user−ID/set−group−ID ビ ッ ト の み を 無 視 し exec() は 成 功 す る 。 Linux で は 、 argvenvp に NULL を 指 定 す る こ と が で き る 。 ど ち ら に NULL を 指 定 し た 場 合 も 、 こ れ ら の 引 き 数 に ヌ ル ポ イ ン タ ー 1 個 だ け を 含 む リ ス ト へ の ポ イ ン タ ー を 指 定 し た の と 同 じ 効 果 を 持 つ 。 「 こ の 間 違 っ た 機 能 を 利 用 し な い こ と 」 。 こ れ は 非 標 準 で 、 移 植 性 も な い 。 他 の ほ と ん ど の UNIX シ ス テ ム で は 、 こ れ を 行 う と エ ラ ー (EFAULT) に な る 。

POSIX.1−2001 は 、 sysconf(3) が 返 す 値 は プ ロ セ ス の 生 存 中 は 変 化 し な い べ き だ と し て い る 。 し か し な が ら 、 Linux 2.6.23 以 降 で は 、 リ ソ ー ス 上 限 RLIMIT_STACK が 変 化 し た 場 合 、 コ マ ン ド ラ イ ン 引 き 数 と 環 境 変 数 を 保 持 す る た め の 空 間 に 対 す る 上 限 が 変 化 し た こ と を 反 映 し て 、 _SC_ARG_MAX が 返 す 値 も 変 化 す る 。

execve() が 失 敗 す る ほ と ん ど の 場 合 、 制 御 は 元 の 実 行 可 能 イ メ ー ジ に 戻 り 、 execve() の 呼 び 出 し 元 が エ ラ ー を 処 理 す る こ と が で き る 。 し か し な が ら 、 (リ ソ ー ス 枯 渇 が 原 因 と な っ た 場 合 な ど 、 ま れ に ) 呼 び 出 し 元 に 制 御 が 戻 る 時 点 を 過 ぎ て か ら エ ラ ー が 発 生 す る 場 合 が あ る 。 元 の 実 行 可 能 イ メ ー ジ は す で に 破 棄 さ れ て い る が 、 新 し い イ メ ー ジ が 完 全 に は 構 築 さ れ て い な い と い う 状 況 で あ る 。 こ の よ う な 場 合 、 カ ー ネ ル は そ の プ ロ セ ス を シ グ ナ ル SIGKILL で 停 止 (kill) す る 。 イ ン タ ー プ リ タ ー ス ク リ プ ト イ ン タ ー プ リ タ ー ス ク リ プ ト の 1行 目 に 許 さ れ て い る 文 字 数 は 、 最 大 127 文 字 で あ る 。 イ ン タ ー プ リ タ ー ス ク リ プ ト の optional−arg 引 き 数 の 解 釈 方 法 は 実 装 に よ り 異 な る 。 Linux で は 、 イ ン タ ー プ リ タ ー 名 interpreter に 続 く 文 字 列 全 体 が イ ン タ ー プ リ タ ー に 1個 の 引 き 数 と し て 渡 さ れ る 。 し か し 、 動 作 が 異 な る シ ス テ ム も あ る 。 あ る シ ス テ ム で は 、 optional−arg の う ち 最 初 の ホ ワ イ ト ス ペ ー ス ま で が 引 き 数 と し て 渡 さ れ る 。 ま た 、 別 の シ ス テ ム で は イ ン タ ー プ リ タ ー ス ク リ プ ト は 複 数 の 引 き 数 を 持 つ こ と が で き 、 optional−arg 内 の ホ ワ イ ト ス ペ ー ス が 引 き 数 の 区 切 り と な る 。

Linux は ス ク リ プ ト の set−user−ID と set−group−ID ビ ッ ト を 無 視 す る 。

execve() と EAGAIN
execve
() を 呼 び 出 し た 際 に (Linux 3.1 以 降 で ) 起 こ り 得 る EAGAIN エ ラ ー の 詳 細 な 説 明 を 以 下 で 行 う 。 直 前 の setuid(2), setreuid(2), setresuid(2) の 呼 び 出 し で 、 そ の プ ロ セ ス の 実 ユ ー ザ ー ID が 変 更 さ れ 、 そ の 変 更 に よ り そ の プ ロ セ ス が RLIMIT_NPROC リ ソ ー ス 上 限 を 超 過 し て し ま っ た 場 合 (す な わ ち 、 新 し い 実 ユ ー ザ ー ID に 属 す る プ ロ セ ス 数 が RLIMIT_NPROC リ ソ ー ス 上 限 を 超 過 し た 場 合 ) に 、 EAGAIN エ ラ ー が 発 生 す る 。 Linux 2.6.0 以 上 3.0 以 下 で は 、 こ れ に よ り set*uid() の 呼 び 出 し が 失 敗 し て い た 。 (Linux 2.6 よ り 前 で は 、 こ の リ ソ ー ス 上 限 は ユ ー ザ ー ID を 変 更 し た プ ロ セ ス に は 適 用 さ れ て い な か っ た 。 )

Linux 3.1 以 降 で は 、 上 で 説 明 し た シ ナ リ オ で は set*uid() の 呼 び 出 し は 失 敗 し な い 。 な ぜ な ら 、 返 さ れ た ス テ ー タ ス の 確 認 を 行 わ ず 「 呼 び 出 し 元 が 特 権 を 持 っ て い る 場 合 に は 」 呼 び 出 し は 必 ず 成 功 す る と み な し て い る バ グ が あ る ア プ リ ケ ー シ ョ ン で は 、 セ キ ュ リ テ ィ ホ ー ル に つ な が る こ と が 非 常 に よ く あ る か ら だ 。 そ の 代 わ り 、 set*uid() の 呼 び 出 し に よ る 実 UID の 変 更 は 成 功 す る が 、 カ ー ネ ル は PF_NPROC_EXCEEDED と い う 名 前 の 内 部 フ ラ グ を セ ッ ト す る 。 こ の フ ラ グ は RLIMIT_NPROC リ ソ ー ス 上 限 が 超 過 し た こ と を 示 す 。 PF_NPROC_EXCEEDED フ ラ グ が セ ッ ト さ れ て い て 、 そ の 後 で execve() が 呼 ば れ た 際 に リ ソ ー ス 上 限 が ま だ 超 過 し て い れ ば 、 そ の execve() の 呼 び 出 し は EAGAIN エ ラ ー で 失 敗 す る 。 こ の カ ー ネ ル の ロ ジ ッ ク に よ り 、 特 権 デ ー モ ン で よ く 行 わ れ る 処 理 フ ロ ー 、 す な わ ち fork(2) + set*uid() + execve() に 対 し て 、 前 と 変 わ ら ず RLIMIT_NPROC リ ソ ー ス 上 限 を 適 用 で き る こ と が 保 証 さ れ る 。

(set*uid() と execve() の 呼 び 出 し の 間 に 、 こ の 実 UID に 属 す る 他 の プ ロ セ ス が 終 了 し て ) 次 に execve() が 呼 び 出 さ れ た 際 に こ の リ ソ ー ス 上 限 が 超 過 し て な け れ ば 、 execve() の 呼 び 出 し は 成 功 し 、 カ ー ネ ル は PF_NPROC_EXCEEDED プ ロ セ ス フ ラ グ を ク リ ア す る 。 同 じ プ ロ セ ス に よ っ て fork(2) の 呼 び 出 し が 後 で 行 わ れ た 場 合 に も 、 こ の フ ラ グ は ク リ ア さ れ る 。 歴 史
UNIX V6 で は exec() コ ー ル の 引 き 数 リ ス ト は 0 で 終 端 さ れ 、 main の 引 き 数 リ ス ト は −1 で 終 端 さ れ て い た 。 そ の た め 、 main の 引 き 数 リ ス ト は 、 そ の 後 の exec() コ ー ル に は 直 接 使 用 で き な か っ た 。 UNIX V7 以 降 で は 、 と も に NULL で 終 端 さ れ る 。

こ の プ ロ グ ラ ム は 、 以 下 の 二 つ 目 の プ ロ グ ラ ム か ら 実 行 す る た め の も の で あ る 。 コ マ ン ド ラ イ ン 引 き 数 を 1行 に 1個 ず つ 表 示 す る だ け の プ ロ グ ラ ム で あ る 。

/* myecho.c */

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
int j;

for (j = 0; j < argc; j++)
printf("argv[%d]: %s\n", j, argv[j]);

exit(EXIT_SUCCESS); } 以 下 の プ ロ グ ラ ム は 、 コ マ ン ド ラ イ ン 引 き 数 で 指 定 し た 名 前 の プ ロ グ ラ ム を 実 行 す る の に 使 う 。

/* execve.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
char *newargv[] = { NULL, "hello", "world", NULL };
char *newenviron[] = { NULL };

if (argc != 2) {
fprintf(stderr, "Usage: %s <file−to−exec>\n", argv[0]);
exit(EXIT_FAILURE); }

newargv[0] = argv[1];

execve(argv[1], newargv, newenviron);
perror("execve"); /* execve() returns only on error */
exit(EXIT_FAILURE); } 二 つ 目 の プ ロ グ ラ ム を 使 っ て 一 つ 目 の プ ロ グ ラ ム を 実 行 す る に は 以 下 の よ う に す る 。

$ cc myecho.c −o myecho
$ cc execve.c −o execve
$ ./execve ./myecho
argv[0]: ./myecho
argv[1]: hello
argv[2]: world さ ら に 、 こ れ ら の プ ロ グ ラ ム を 使 っ て 、 ス ク リ プ ト イ ン タ ー プ リ タ ー の 例 を 示 す 。 こ の た め に 、 「 イ ン タ ー プ リ タ ー 」 と し て 先 ほ ど 作 成 し た プ ロ グ ラ ム myecho を 使 う ス ク リ プ ト を 作 成 す る 。

$ cat > script
#!./myecho script−arg
^D

$ chmod +x script 作 成 し て お い た プ ロ グ ラ ム を 使 っ て ス ク リ プ ト を 実 行 す る 。

$ ./execve ./script
argv[0]: ./myecho
argv[1]: script−arg
argv[2]: ./script
argv[3]: hello
argv[4]: world

関 連 項 目

chmod(2), execveat(2), fork(2), ptrace(2), execl(3), fexecve(3), getopt(3), credentials(7), environ(7), path_resolution(7), ld.so(8)

こ の 文 書 に つ い て

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