Команда cd в C и использование chdir () - PullRequest
1 голос
/ 08 мая 2019

Мне поручено программировать команду linux cd на C. Я подумал, что это будет довольно тривиально, если использовать метод chdir(), но мои каталоги не меняются.Что интересно, статус возврата chdir () равен 0, а не -1, что означает, что chdir () не потерпел неудачу.Вот два случая, когда я использую chdir():

1.

    char *dir = getenv("HOME");   // Here dir equals the home environment.
    int ret = chdir(dir);

    printf("chdir returned %d.\n", ret);

ret возвращает 1.

2.

    int ret = chdir(dir);   // Here dir equals the user's input.

    printf("chdir returned %d.\n", ret);

ret возвращает 1, если каталог существует в моем пути.

Я использую chdir() неправильно?Я не могу найти ответ на это нигде.Любая помощь будет высоко ценится.

1 Ответ

5 голосов
/ 08 мая 2019

chdir() изменяет только рабочий каталог вызывающего процесса.

Поэтому, когда у вас есть код, подобный ...

int main() {
  // 1
  chdir("/"); // error handling omitted for clarity
  // 2
}

... искомпилируйте это в программу example и затем запустите ее в оболочке:

$ pwd # 3
/home/sweet
$ ./example # 4
$ pwd # 5
/home/sweet

Затем у вас в игре два процесса,

  1. оболочка, котораягде вы ввели pwd и ./example

  2. ./example, процесс запущен (оболочкой) с вашей программой компиляции.

chdir() является частью вашей скомпилированной программы, а не оболочки, поэтому она влияет только на процесс с вашей программой, не оболочка.

Итак, на // 1 рабочий каталогвашей программы (в приведенном выше примере выполнения) - /home/sweet, но на // 2 это /, как указано в вызове chdir() выше.Это не влияет на оболочку и вывод pwd # 5, хотя!

...