2017-02-20 29 views
0

當我嘗試運行./shell時,cd包含/ 我實際上沒有更改到includes目錄。這裏是我的代碼:爲什麼不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

不能運行的程序才能更改其他程序(你的shell)的目錄。

會發生什麼事是

  1. 一個新的進程催生了運行程序
  2. 這程序調用chdir(),以改變其當前目錄
  3. 程序結束,導致進程死
  4. 殼仍然在哪裏

這就是爲什麼cd在shell中是一個內置命令。

+0

我試圖叉的過程中,它仍然不工作:/ – franklinsing

+0

@franklinsing不,當然不是,*目的*叉的'()'是創建一個新的進程。更改新進程的當前目錄將永遠不會「繼承」到其父項,這就是我的觀點。 – unwind

+0

啊,我明白你的意思了,謝謝! – franklinsing

0

,除非你開發自己的殼,你不能創建一個cd命令是這樣的。

chdir命令的作品,但只有你的程序中。一旦你退出它,你就回到了父shell的當前目錄。