我知道cd
是内置的shell,我可以使用system()
来运行它。
但cd
家庭可能会运行exec()
命令吗?
编辑:我刚注意到execvp()
也毫无意义。谢谢大家的帮助。
答案 0 :(得分:12)
最好使用int chdir(const char *path);
中的unistd.h
。
答案 1 :(得分:12)
exec
加载可执行文件并用它替换当前程序图像。正如您所正确指出的那样,cd
不是可执行文件,而是内置的shell。因此,您要运行的可执行文件是shell本身。这当然是system()
为您所做的事情,但如果您想明确一下,可以使用exec
:
execl("/bin/sh", "-c", "cd", (const char *)0);
由于此替换您当前的过程映像,因此您应该在fork()
关闭新进程后执行此操作。
然而,这整个过程绝对没有效果。如果要更改当前进程中的目录,请使用chdir()
。
答案 2 :(得分:3)
虽然如前所述system("cd xxx")
不会更改您的应用程序当前目录,但它并非完全没用。
您仍然可以使用系统退出状态来了解将当前目录更改为所声明的目录是否成功。
同样,如果您喜欢复杂的解决方案,您也可以使用fork / exec执行相同的操作,使用exec'ing /bin/sh -c cd xxx
或简单地/bin/cd xxx
使用提供独立cd
的操作系统可执行文件。
但我会建议这种非过度杀手等同于access("xxx", X_OK|R_OK)
注意:所有符合POSIX标准的操作系统 must 都提供独立的CD可执行文件。这至少是Solaris,AIX,HP-UX和Mac OS/X的情况。
答案 3 :(得分:2)
不,不是,这没用。 chdir
(更改进程当前目录的函数)仅影响调用它的进程(及其子进程)。它不会特别影响其父母。
所以exec
cd
没有意义,因为在更改目录后,该过程会立即退出。
(如果你真的想要,你可以执行类似bash -c cd /tmp
的内容,但正如我所说,这是徒劳的。)
答案 4 :(得分:0)
当fork完成时,子进程从父进程继承环境变量CWD(当前工作目录)。如果fork和exec照常完成,则子进程调用chdir(),只需将目录更改为新目录并且退出但这不会影响父母。因此,新环境将会丢失..