Использование семейства exec () для запуска команды "cd" - PullRequest
6 голосов
/ 25 марта 2012

Я знаю, что cd является встроенной оболочкой, и я могу запустить ее с помощью system().

Но возможно ли выполнить команду cd с помощью семейства exec(), как execvp()?

Редактировать: И я только что заметил, что system("cd") также бессмысленно. Спасибо всем за помощь.

Ответы [ 5 ]

12 голосов
/ 25 марта 2012

exec загружает исполняемый файл и заменяет им текущий образ программы.Как вы правильно заметили, cd - это не исполняемый файл, а встроенная оболочка.Таким образом, исполняемый файл, который вы хотите запустить - это сама оболочка.Это, конечно, то, что system() делает для вас, но если вы хотите быть откровенным об этом, вы можете использовать exec:

execl("/bin/sh", "-c", "cd", (const char *)0);

, так как этот заменяет ваш текущий процессimage, вы должны сделать это после fork() запуска нового процесса.

Однако вся эта процедура не имеет абсолютно никакого эффекта.Если вы хотите изменить каталог в вашем текущем процессе, используйте chdir().

12 голосов
/ 25 марта 2012

Вам лучше использовать int chdir(const char *path); из unistd.h.

3 голосов
/ 25 марта 2012

Хотя, как уже говорилось, system("cd xxx") не изменит текущий каталог вашего приложения, он не является полностью бесполезным.

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

Точно так же, если вам нравятся сложные решения, вы также можете сделать то же самое с fork / exec, либо с exec'ing /bin/sh -c cd xxx, либо просто /bin/cd xxx с ОС, предоставляющими независимый cd исполняемый.

Однако я бы порекомендовал этот более быстрый эквивалент без перегиба access("xxx", X_OK|R_OK)

Примечание: Все POSIX-совместимые ОС должны обеспечивать независимыйCD исполняемый файл.По крайней мере, это относится к Solaris , AIX , HP-UX и Mac OS / X .

2 голосов
/ 25 марта 2012

Нет, это не так, и это было бы бесполезно.chdir (функция, которая изменяет текущий каталог процесса) влияет только на процесс, который вызывает его (и его дочерние элементы).В частности, он не влияет на своего родителя.

Так что exec ing cd не имеет смысла, поскольку процесс завершится сразу после изменения каталогов.bash -c cd /tmp если вы действительно хотите, но, как я уже сказал, это бесполезно.)

0 голосов
/ 10 ноября 2012

Когда выполняется форк, переменная окружения CWD (текущий рабочий каталог) наследуется дочерним элементом от родителя. Если fork и exec выполняются как обычно, тогда дочерний элемент вызывает chdir (), который просто меняет каталог на новый каталог.и выходит, но это не влияет на родителя. Таким образом, новая среда теряется ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...