2017-02-20 5 views
0

./shellを実行しようとするとcdに/ がインクルードディレクトリに実際には変更されません。ここに私のコード:なぜchdir()が動作しないのですか?

int cd(char *path) { 
     printf("i got there at least\n"); 
     if(path == NULL) { 
       printf("dont waork\n"); 
       print_usage(); 
     } else { 

       printf("print please\n"); 
       int dir_change = chdir(path); 
       if(dir_change != 0) 
         print_no_directory(path); 

     } 
     return 1; 
} 


int shell(int argc, char *argv[]) { 

     pid_t pid; 
     int status; 

     pid = fork(); 
     if(pid == 0) { 
       execl("cd", argv[0], argv[1], argv[2], (char*)NULL); 
       printf("argv[1]: %s\n", argv[1]); 
       if(!strcmp(argv[1], "cd")) { 
         cd(argv[2]); 
       } 
     } else if(pid > 0) { 
       waitpid(pid, &status, WUNTRACED); 
     } else { 
       print_fork_failed(); 
     } 
     return 0; 
} 

私のコードに間違いはありません。

答えて

1

プログラムを実行して、別のプログラム(シェル)のディレクトリを変更することはできません。何が起こる

は、新しいプロセスが

  • を死ぬためにプロセスを引き起こし、プログラムが現在のディレクトリに
  • プログラムの終了を変更するには、chdir()を呼び出すことあなたのプログラム
  • を実行するために生み出され

    1. ですシェルはまだそれがあった場所です

    だからこそcdシェルには組み込みのコマンドがあります。

  • +0

    私はプロセスをフォークしようとしましたが、まだ動作しません:/ – franklinsing

    +0

    @franklinsingいいえ、もちろん、fork()の*目的*は新しいプロセスを作成することです。新しいプロセスの現在のディレクトリを変更しても、その親に "継承されることはありません"というのが私の主張です。 – unwind

    +0

    ああ、私はあなたが何を意味するかを見て、ありがとう! – franklinsing

    0

    独自のシェルを開発しない限り、このようなcdコマンドを作成することはできません。

    chdirコマンドは機能しますが、プログラム内でのみ機能します。終了すると、親シェルのカレントディレクトリに戻ります。

    関連する問題