execve - 執行程式
#include <unistd.h>
int execve (const char *filename, char *const argv
[], char *const envp[]);
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.
呼叫成功 的 時候
execve()
不會 返回, 呼叫失敗 時
返回 -1, 並 設定
errno 為
相應的 值.
- EACCES
- 檔案 或
指令碼直譯器
不正確.
- EACCES
- 沒有 檔案 或
指令碼直譯器 的 執行
許可權.
- EACCES
- 檔案系統 掛載(mount)
為 noexec.
- EPERM
- 檔案系統 掛載為
nosuid, 使用者 不是
超級使用者, 以及
檔案 設定了 SUID 或 SGID
位.
- EPERM
- 程序 正 被跟蹤,
使用者 不是
超級使用者, 以及
檔案 設定了 SUID 或 SGID
位.
- E2BIG
- 引數列表 過長.
- ENOEXEC
- 可執行檔案 的
檔案格式 無法 識別,
誤用在 不同的
體系結構, 或者 其他
格式 錯誤 導致 程式
無法 執行.
- EFAULT
-
filename 指標 超出
可訪問 的 地址空間.
- ENAMETOOLONG
-
filename 太長.
- ENOENT
-
filename ,
指令碼直譯器, 或 ELF
直譯器 不存在.
- ENOMEM
- 核心 空間 不足.
- ENOTDIR
- 在 filename ,
指令碼直譯器 或 ELF
直譯器 的 字首 路徑
中, 某些 成員 不是
目錄.
- EACCES
- 在 filename 或
指令碼直譯器 的 字首
路徑 中, 對 某些 目錄
沒有 訪問許可.
- ELOOP
- 解析 filename ,
指令碼直譯器 或 ELF
直譯器 時 遇到
過多的 符號連線.
- ETXTBUSY
- 可執行檔案 被
一個 或 多個 程序 以
寫方式 開啟.
- EIO
- 發生 I/O 錯誤.
- ENFILE
- 達到 系統 定義的
同時開啟檔案數
限制.
- EMFILE
- 程序 打開了
最大數量 的 檔案.
- EINVAL
- 該 ELF 可執行檔案
擁有 多個 PT_INTERP 欄位
(就是說, 試圖 定義
多個 直譯器).
- EISDIR
- ELF 直譯器 是
目錄.
- ELIBBAD
- 無法 識別 ELF
直譯器 的 格式.
SVr4, SVID, X/OPEN, BSD 4.3. POSIX 沒有 對 #! 行為
的 文件, 但有 其他的
相容 形式. SVr4 記錄了
額外的 錯誤情況 EAGAIN, EINTR,
ELIBACC, ENOLINK, EMULTIHOP; POSIX 沒有 關於 ETXTBSY,
EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR 或 ELIBBAD
錯誤情況 的 文件.
SUID and SGID processes can not be
ptrace()d SUID or SGID.
在 #! 格式的 shell
可執行指令碼 中,
第一行 的 長度 不得
超過 127 位元組.
Linux 忽略 指令碼程式 的 SUID
和 SGID 位.
ld.so(8),
execl(3),
fork(2)
徐明 <[email protected]>
2003/05/13
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh