2011-08-03 18 views
1

私の目標は、Linuxの基本シェルのようなCプログラムを書くことです。作業ディレクトリの変更以外はすべて作業しています。私はcdの入力文字列に対してsystem()を試しましたが、何も起こりませんでした。私もchdir("tokened string")と幸運を試しました。誰にでもアイデアはありますか?これは私のコードの一部です:CプログラムのLinuxシェルの作業ディレクトリの変更

 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")ではなくchdir("foo\n")と表示されます。

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

dirの変更中にエラーが発生しました:不明なエラー18446744073709551615 Googleとは何を意味するのかわかりません... – yaegerbomb

+0

興味深い。 ... '18446744073709551615'は「符号なしlong longの最大値」 – hari

+0

いくつか変更して、今これを取得しています:dirの変更中のエラー:そのようなファイルまたはディレクトリがありません – yaegerbomb

関連する問題