2012-11-22 26 views
0
  1. 我即將在Ubuntu上編寫一個簡單的shell。 我想過使用exevcp()函數。 我只能運行「ls」命令,其他命令似乎都不起作用。 有人能告訴我爲什麼會發生這種情況,或者給我一個更好的方法來構建shell的想法?使用execvp在C上構建一個shell

  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); 
    } 
    

能否請你解釋一下,好嗎?

回答

3

exec(3)只能用於運行外部程序。 history是大多數shell中內置的,不能以這種方式運行。

+0

那麼你能告訴我該怎麼解決這個問題嗎? – hudac

+0

恩,首先你寫實現,然後你調用它。 –

+0

好吧,我明白一點,謝謝 – hudac

1

execvp()系統調用有兩個參數:要執行的程序的名稱和指向作爲命令參數的以空字符結尾的字符串列表的指針。

例如:

char *args[] = { "ls", "-l", "-t", "-r", ".", 0 }; 
execvp(args[0], args); 
...report error... 

你不能簡單地整個字符串傳遞到execvp()並期望它把它分裂;調用代碼必須這樣做。請注意,如果execvp()的第一個參數指向的字符串包含斜槓,那麼$PATH機制不用於查找該命令。使用$PATH搜索普通名稱(如圖所示,"ls")。

您還必須記住,某些命令(如historycd)是shell內置函數;沒有外部可執行文件,您可以運行以獲得相同的效果您將無法運行這些。其他命令,如test(又名[)通常作爲內置程序實現,但通常還有一個/bin/usr/bin中的二進制文件,它可以執行(或多或少)相同的作業,因此您可以調用該作業。