2012-10-03 57 views
3

我對C非常陌生,並且在一個OS類中,我需要在C(yay)中編寫一個基本shell。它實際上已經走到半路,我只是在學習C基礎知識的同時完成這項工作。用execve在C中調用mkdir系統調用C

我想在分叉和調用之後使用exec,現在是mkdir。這些論點需要我通過一點點,但我一直在試圖弄清楚,希望有人能告訴我我出了什麼問題。

  } else { 
      //fork exec 
      int pid = fork(); 
      if (pid == 0) { 
       printf("%s",my_argv[0]); 
       execve("/bin/mkdir",my_argv,0); 
      } else wait(NULL); 
     } 

這是我對mkdir調用作出響應的部分。現在,我有一個線[]這是從用戶輸入的命令採取

command = strtok(line, DELIMITERS); 

的arg:

arg = strtok(0,DELIMITERS); 
     my_argv[0] = arg; 

一切編譯罰款,但從來沒有的mkdir工作。打印my_argv [0]給出了我期望的正確參數。我敢肯定,這是愚蠢的,但任何提示將不勝感激。

全部代碼:

int main(int argc, char *argv[]) 
{ 
char *command; 
char line[MAXLINE]; 
char *arg = NULL; 
char *my_argv[]; 


while(1) { 
    printf(PROMPT); 
    if (fgets(line,MAXLINE,stdin) != NULL) { 
     //take out \n 
     line[strlen(line)-1] = '\0'; 
    } 
    //looks for first delimiter, saves as the command 
    command = strtok(line, DELIMITERS); 


    //start looking at what command it is by comparing 
    if (strcmp(command,"cd")==0) { 
     //if they equal zero, they match 
     //this is a cd command, must have following arg 
     if (argv[1] == NULL) chdir("/"); 
     else chdir(argv[1]);//chdir is the system call for cd 
    } else if (strcmp(command,"exit")==0) { 
     break; 
    } else if (strcmp(command,"mkdir")==0){ 
     arg = strtok(0,DELIMITERS); 
     my_argv[0] = arg; 
     my_argv[1] = NULL; 
     if (!arg) { 
      printf("Usage: mkdir missing arg\n"); 
     } else { 
      //fork exec 
      int pid = fork(); 
      if (pid == 0) { 
       printf("%s",my_argv[0]); 
       //mkdir(arg); 
          execve("/bin/mkdir",my_argv,0); 
      } else wait(NULL); 
     } 
    } 


} 
return 0; 
} 
+1

注意,有一個[ 'mkdir'功能](http://pubs.opengroup.org/onlinepubs/009695399/functions/mkdir.html)。你真的不必爲此執行完整的其他程序。 – cHao

+0

是的,我希望它很容易 – dundermiff

+0

有沒有理由不能使用'mkdir'函數,或者是作業的要求? –

回答

5
  • argv[0]包含程序
  • argv[1]的名字是第一個參數
  • 參數列表必須爲NULL終止
+0

我把my_argv [1] = NULL,並嘗試「mkdir測試」,並返回測試:缺少操作數。我也確保我在同一個目錄中XD – dundermiff

+0

請參閱更新..... –

+0

我不知道,因爲當我打印argv [0]時,我得到我正在尋找的參數。所以輸入是mkdir testFolder和argv [0]是testFolder – dundermiff