2013-12-14 90 views
0

命令解釋我必須寫在C的命令解釋它必須:實現用C

  • 手柄命令選項和參數
  • 支持命令,而無需選項和參數
  • 允許重定向一個命令到另一個(例如:ls -a | wc)以3最大重定向

我們也可以假設一個固定的最大的參數(比如MAXARG)。

此刻我寫了這段代碼,但我不知道爲什麼有些命令不起作用(例如cd)。請幫幫我。

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 

void parse(char *line, char **argv) 
{ 
while (*line != '\0') {  
     while (*line == ' ' || *line == '\t' || *line == '\n' || *line=='|') 
      *line++ = '\0';  
     *argv++ = line;   
     while (*line != '\0' && *line != ' ' && 
      *line != '\t' && *line != '\n') 
      line++;    
} 
*argv = '\0';    
} 


int main(int argc,char *argv[]) 
    { 
    int child_pid; 
    char * arg[10];  
    int child_status; 
    char str[10]; 
    do 
    { 
    printf(">> "); 
    gets(str); 
    parse(str,arg); 
    if(!strcmp(arg[0],"end")) 
    { 
    break; 
    } 
    child_pid = fork(); 
    if(child_pid == 0) 
    { 
    execvp(*arg,arg); 
    printf("Unknown command\n"); 


    } 
    else 
    { 
    wait(&child_status); 
    printf("koniec\n"); 
    } 
} 
    while(1==1); 
    return 0; 
} 
+0

*我必須在C編寫命令解釋程序*我以爲皮諾切特已經死了 –

回答

2

你需要一個語法/詞法分析器來檢查你的輸入,這些工具已經上市,幾個名字:YACCBisonFlex

關於您的<command> | <command>的情況是pipe,並且是由linux內核空間提供的功能,如果您希望您需要使用Linux內核api編碼管道。

+0

在Linux和C中我絕對是綠色的。你能舉個例子嗎? – Damian

+0

@ user2900036你只需要搜索,這些是在linux/unix下編程時最流行的主題,你會發現任何與任何搜索引擎,即使在SO http://stackoverflow.com/questions/5823838/flex-bison -and-c-looking-a-very-basic-introduction! – user2485710

+0

@ user2900036,'man fork','man popen'。 –

2

對於cd,你不應該做一個fork/exec,因爲那樣,你只會改變孩子的工作目錄,這與改變父目錄的工作目錄不一樣。對於像cd這樣的命令,您必須在使用chdir(2)進行解析之前不使用fork

+0

程序將知道何時使用以及何時不使用execvp – Damian

+0

這是由您來決定何時分析問題。這可能有助於研究目前的炮彈是如何實施的。 shell有很多內建的命令,作爲程序員,你必須決定哪些內容不需要通過fork/exec。例如,算術函數,控制函數(if/then/for/while/case)不能使用fork/exec機制來實現。任何具有二進制可執行文件的用戶命令通常都會使用fork/exec來實現。 – unxnut