關於你的問題:
在手冊頁它說execvp
替換過程映像 的形象與新的。但是,在這裏我運行的命令不是 可執行文件。
很久以前的shell非常有限,幾乎所有的UNIX命令都是獨立的可執行文件。現在,主要爲了速度的目的,UNIX命令的一些子集是在shell本身內部實現的,那些命令被稱爲builtins
。您可以檢查任何命令在你的shell內置的或無法通過type
命令來實現:
λ ~/ type echo
echo is a shell builtin
(帶有介紹內建的完整列表可在man
頁面,你的shell如man bash-builtins
或man builtin
找到)
但仍然大部分的命令仍然有其可執行文件,對應:
λ ~/ whereis echo
/bin/echo
因此,在特定情況下,當你正在運行:
char* arg[] = {"ls", "-l", NULL};
execvp(arg[0],arg);
你實際上是用的(最有可能)/bin/ls
地址空間替代當前進程的地址空間。
我的直覺是我要讀文件,並且可以解析它來存儲 參數在ARG。
確實,你有。但你也可以使用一些內核函數爲又名「家當」:
而不是把文件名在單獨文件中添加所謂的家當作爲文件的第一行要貓:
#!/bin/cat
並添加chmod +x
它。然後,你可以爲可執行文件(通過任何的exec
功能或外殼)運行:
λ ~/tmp/ printf '#!/bin/cat\nTEST\n' > cat_me
λ ~/tmp/ chmod +x cat_me
λ ~/tmp/ ./cat_me
#!/bin/cat
TEST
原因是與文件打印shebang
自身的缺點,但它仍然是有趣的事情是在內核=)
順便說一句。您描述的問題,如果很常見,以至於有一個稱爲xargs
的特殊可執行文件(在非常簡單的解釋中)執行通過stdin傳遞的參數列表上的給定程序。欲瞭解更多信息,請諮詢man xargs
。
對於exec
容易記憶 - 家庭我經常使用下表:
Figure 8.14. Differences among the six exec functions
+----------+----------+----------+----------+--------+---------+--------+
| Function | pathname | filename | agr list | argv[] | environ | envp[] |
+----------+----------+----------+----------+--------+---------+--------+
| execl | * | | * | | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execlp | | * | * | | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execle | * | | * | | | * |
+----------+----------+----------+----------+--------+---------+--------+
| execv | * | | | * | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execvp | | * | | * | * | |
+----------+----------+----------+----------+--------+---------+--------+
| execve | * | | | * | | * |
+----------+----------+----------+----------+--------+---------+--------+
| letter | | p | l | v | | e |
+----------+----------+----------+----------+--------+---------+--------+
所以你的情況execvp
需要的文件名,argv(包含v)和environ(ê)。 然後它試圖通過將filename
(在您的案例cat
中)附加到PATH
中的每個路徑組件來「猜測」路徑名(又名完整路徑),直到找到可執行文件filename
的路徑。
更多關於exec
的引擎蓋(包括繼承材料)的更多信息可以在Advanced Programming in the UNIX Environment (2nd Edition) by W. Richard Stevens and Stephen A. Rago又名APUE2中找到。
如果您對UNIX內部感興趣,您應該閱讀它。
linux中的所有命令都是可執行文件。 – Alex
在終端輸入'ls'來查看'ls'程序的位置。當你說'ls'時,你確實正在運行一個可執行文件。 – Cornstalks
@Alex:除了在shell中實現的一些特殊命令外,例如'cd','source'和'exit'。 – duskwuff