NAME
execve - 執 行 程 序
總 覽 (SYNOPSIS)
#include <unistd.h>
int execve (const char *filename, char *const argv [], char *const envp[]);
描 述 (DESCRIPTION)
execve() 執 行 filename 指 出 的 程 序 . filename 必 須 是 二 進 制 可 執 行 文 件 , 或 者 以 "#! interpreter [arg]" 行 開 始 的 腳 本 文 件 . 後 者 的 interpreter 必 須 是 某 個 可 執 行 文 件 的 有 效 路 徑 , 這 個 可 執 行 文 件 自 身 不 能 是 腳 本 程 序 , 調 用 形 式 是 "interpreter [arg] filename".
execve() 調 用 成 功 後 不 會 返 回 , 其 進 程 的 正 文 (text), 數 據 (data), bss 和 堆 棧 (stack) 段 被 調 入 程 序 覆 蓋 . 調 入 程 序 繼 承 了 調 用 程 序 的 PID 和 所 有 打 開 的 文 件 描 述 符 , 他 們 不 會 因 爲 exec 過 程 而 關 閉 . 父 進 程 的 未 決 信 號 被 清 除 . 所 有 被 調 用 進 程 設 置 過 的 信 號 重 置 爲 缺 省 行 爲 . 如 果 當 前 程 序 正 在 被 ptrace 跟 蹤 , 成 功 的 調 用 execve() 後 將 收 到 一 個 SIGTRAP 信 號 . 如 果 可 執 行 文 件 是 動 態 連 接 的 a.out 二 進 制 程 序 , 含 有 共 享 庫 的 stub, 開 始 執 行 程 序 的 時 候 , Linux 動 態 連 接 器 (linker) ld.so(8) 把 所 需 的 共 享 庫 調 入 核 心 , 並 且 和 程 序 相 連 . 如 果 可 執 行 文 件 是 動 態 連 接 的 ELF 二 進 制 程 序 , 定 義 在 PT_INTERP 字 段 的 解 釋 器 (interpreter) 調 入 所 需 的 共 享 庫 . 連 接 libc5 的 程 序 的 典 型 解 釋 器 是 /lib/ld-linux.so.1, 而 連 接 GNU libc2 (libc6) 的 程 序 則 爲 /lib/ld-linux.so.2.
返 回 值 (RETURN VALUE)
調 用 成 功 的 時 候 execve() 不 會 返 回 , 調 用 失 敗 時 返 回 -1, 並 設 置 errno 爲 相 應 的 值 .
錯 誤 (ERRORS)
EACCES 文 件 或 腳 本 解 釋 器 不 正 確 |
.
執 行 權
限 .
爲 nosuid, 使 用 者 不 是 超 級 用 戶 , 以 及 文 件 設 置 了 SUID 或 SGID 位 .
進 程 正 被 跟 蹤 , 使 用 者 不 是 超 級 用 戶 , 以 及 文 件 設 置 了 SUID 或 SGID 位 .
參 數 列 表 過 長 .
文 件 格
式 無 法 識 別 , 誤
用 在 不 同 的 體
系 結 構 , 或 者 其
他 格 式 錯 誤 導
致 程 序 無 法 執
行 . filename 指 針 超 出 可 訪 問 的 地 址 空 間 . ENAMETOOLONG filename 太 長 .
|