2011-08-03 33 views
1

我的目標是編寫一個類似於Linux的基本shell的C程序。除了更改工作目錄之外,我有一切工作。我試過system()輸入字符串爲cd並沒有發生任何事情。我也試過chdir("tokened string")也沒有運氣。有人有主意嗎?這是我的代碼的一部分:在C程序中更改Linux shell中的工作目錄

 fgets(cmdStr, sizeof(cmdStr), stdin); 

     if(strncmp("quit", cmdStr, 4) == 0 || strncmp("Quit", cmdStr, 4) == 0 ) 
     { 
      break; 
     } 
     else if(strncmp("cd", cmdStr, 2) == 0) 
     { 
      char *token = strtok(cmdStr, " "); 
      token = strtok(NULL, " "); 
      chdir(token); 
     } 
     else 
     { 
      system(cmdStr); 
     } 
    } 

是否有可能這樣做?或者這是一個簡單的例子,與兒童外殼不能做某些事情有關嗎?

編輯:上面的代碼是完整的。

+3

'chdir'是正確的。它的回報價值是多少?如果-1,errno是什麼? (總是檢查系統調用的返回值。) – Nemo

+0

@Nemo無論字符串是什麼,返回值都是-1。多次嘗試不同的字符串。不知道如何檢查它與-1一起產生的錯誤。有什麼建議麼? – yaegerbomb

+1

檢查errno – hari

回答

5

fgets()cmdstr'\n'字符。

如果您輸入cd foo,您將撥打chdir("foo\n")而不是chdir("foo")

2

您的chdir呼叫失敗,返回值爲-1

請嘗試打印errno這樣的:

errno = 0; 
chdir(token); 
if (errno != 0) { 
    printf("Error changing dir: %s\n", strerror(errno)); 
} 

基思是正確的:\n在結束時殺了你。

你可以做以下,以擺脫它:

char *ptr = cmdStr; 
<snip> 
    else if(strncmp("cd", cmdStr, 2) == 0) 
    { 
      strsep(&ptr, " ");  /* skip "cd" */ 
      char *chr = strsep(&ptr, "\n"); /* skip "\n" */ 
      errno = 0; 
      chdir(chr); 
      if (errno != 0) 
       printf("Error changing dir: %s\n", strerror(errno)); 
    } 
</snip> 
+0

錯誤更改目錄:未知錯誤18446744073709551615 不知道這是什麼意思,谷歌沒有幫助... – yaegerbomb

+0

有趣。 ...'18446744073709551615'是「無符號long long的最大值」 – hari

+0

做了一些改變,現在我得到這個:更改目錄的錯誤:沒有這樣的文件或目錄 – yaegerbomb