簡體   English   中英

使用execvp在Ubuntu上的C中構建Shell

[英]Building a shell in C on Ubuntu using execvp

  1. 我准備在Ubuntu上用C編寫一個簡單的shell。 我考慮過使用exevcp()函數。 我只能運行“ ls”命令,其他命令似乎都不起作用。 有人可以告訴我為什么會發生這種情況,或者給我一個更好的構建外殼的方法的想法嗎?

  2. 我的目的是建立這個外殼。 我不明白為什么我不能只接受命令行並將其原樣放入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" )。

您還必須記住,某些命令(例如historycd )是shell內置的;它們必須是內置的。 沒有外部可執行文件可以運行以達到相同的效果。您將無法運行這些可執行文件。 其他命令(例如test (aka [ ))通常實現為內置命令,但/bin/usr/bin中通常也有一個二進制文件(或多或少)執行相同的工作,因此您可以調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM