2017-02-20 3 views
0

Когда я пытаюсь запустить ./shell cd includes/ На самом деле я не изменяю каталог include. Вот мой код:Почему не работает 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

Вы не можете запустить программу, чтобы изменить каталог другой программы (вашей оболочки).

Что происходит

  1. Новый процесс породил для запуска вашей программы
  2. Этой программа вызывает chdir(), чтобы изменить текущий каталог
  3. Конца программы, в результате чего процесса умереть
  4. Оболочка все еще находится там, где она была

Именно поэтому cd в оболочке есть встроенная команда.

+0

Я пытался развить процесс, он все еще не работает:/ – franklinsing

+0

@franklinsing Нет, конечно же, * цель * 'fork()' заключается в создании нового процесса. Изменение текущего каталога нового процесса никогда не будет «унаследовано обратно» его родителям, это моя точка. – unwind

+0

А, я понимаю, что вы имеете в виду, спасибо! – franklinsing

0

Вы не можете создать команду cd, если вы не разработали свою собственную оболочку.

Команда chdir работает, но только внутри вашей программы. Когда вы выйдете из него, вы вернетесь в родительский текущий каталог.

Смежные вопросы