2011-08-03 29 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