[英]Using the exec() family to run the “cd” command
我知道cd
是內置的shell,我可以使用system()
運行它。
但是可以運行exec()
系列的cd
命令,比如execvp()
嗎?
編輯:我只是注意到system("cd")
也沒有意義。謝謝大家的幫助。
你最好使用int chdir(const char *path);
在unistd.h
找到。
exec
加載可執行文件並用它替換當前程序映像。 正如您所正確指出的那樣, cd
不是可執行文件,而是內置的shell。 因此,您要運行的可執行文件是shell本身。 這當然是system()
為你做的,但如果你想明確它,你可以使用exec
:
execl("/bin/sh", "-c", "cd", (const char *)0);
由於這會替換當前的過程映像,因此應在fork()
關閉新進程后執行此操作。
但是,這整個過程絕對沒有效果。 如果要更改當前進程中的目錄,請使用chdir()
。
雖然,如前所述system("cd xxx")
不會更改您的應用程序當前目錄,但它並非完全無用。
您仍然可以使用系統退出狀態來了解將當前目錄更改為已聲明的目錄是否成功。
類似地,如果您喜歡復雜的解決方案,您也可以使用fork / exec執行相同的操作,使用exec'ing /bin/sh -c cd xxx
或使用提供獨立cd
可執行文件的操作系統的/bin/cd xxx
。
但是我會建議這種非過度access("xxx", X_OK|R_OK)
更快的等效access("xxx", X_OK|R_OK)
注意:所有符合POSIX的操作系統必須提供獨立的cd可執行文件。 至少在Solaris , AIX ,HP-UX和Mac OS / X中就是這種情況 。
不,它不是,它是沒有用的。 chdir
(更改進程當前目錄的函數)僅影響調用它的進程(及其子進程)。 它並不特別影響其父母。
因此exec
cd
沒有意義,因為在更改目錄后進程將立即退出。
(如果你真的想要,你可以執行類似bash -c cd /tmp
東西,但正如我所說,這是徒勞的。)
當fork完成時,子進程從父進程繼承環境變量CWD(當前工作目錄)。如果fork和exec照常完成,則子進程調用chdir(),它只是將目錄更改為新目錄並退出但是這不會影響parent.Hence,新環境會丟失..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.