[英]Building a shell in C on Ubuntu using execvp
我准備在Ubuntu上用C編寫一個簡單的shell。 我考慮過使用exevcp()
函數。 我只能運行“ ls”命令,其他命令似乎都不起作用。 有人可以告訴我為什么會發生這種情況,或者給我一個更好的構建外殼的方法的想法嗎?
我的目的是建立這個外殼。 我不明白為什么我不能只接受命令行並將其原樣放入execvp()
函數。
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <errno.h> int main(int argc,char **argv,char **envp) { char* args[] = {"history" , NULL}; execvp(args[0],args); }
你能跟我解釋一下嗎?
exec(3)
僅可用於運行外部程序。 history
是大多數Shell中的內置功能,因此無法以這種方式運行。
execvp()
系統調用具有兩個參數:要執行的程序的名稱,以及指向以空值結尾的字符串列表的指針,這些字符串是命令的參數。
例如:
char *args[] = { "ls", "-l", "-t", "-r", ".", 0 };
execvp(args[0], args);
...report error...
您不能簡單地將整個字符串傳遞給execvp()
並期望將其拆分。 調用代碼必須這樣做。 請注意,如果execvp()
的第一個參數指向的字符串包含斜杠,則不會使用$PATH
機制查找命令。 使用$PATH
搜索一個純名稱(如圖所示, "ls"
)。
您還必須記住,某些命令(例如history
和cd
)是shell內置的;它們必須是內置的。 沒有外部可執行文件可以運行以達到相同的效果。您將無法運行這些可執行文件。 其他命令(例如test
(aka [
))通常實現為內置命令,但/bin
或/usr/bin
中通常也有一個二進制文件(或多或少)執行相同的工作,因此您可以調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.