我知道cd
是內置的shell,我可以使用system()
來運行它。使用exec()系列運行「cd」命令
但是,這是有可能由exec()
家庭運行cd
命令,如execvp()
?
編輯:我只注意到system("cd")
也沒有意義。感謝大家的幫助。
我知道cd
是內置的shell,我可以使用system()
來運行它。使用exec()系列運行「cd」命令
但是,這是有可能由exec()
家庭運行cd
命令,如execvp()
?
編輯:我只注意到system("cd")
也沒有意義。感謝大家的幫助。
exec
加載一個可執行文件與它替換當前節目圖像。正如你正確地指出,cd
是而不是一個可執行文件,而是一個shell內置。所以你想運行的可執行文件就是shell本身。當然,這是爲你做什麼system()
的,但如果你想明確一下,你可以使用exec
:
execl("/bin/sh", "-c", "cd", (const char *)0);
由於這取代您當前的進程映像,你應該這樣做fork()
後,荷蘭國際集團關閉一個新的過程。
但是,整個過程完全沒有影響。如果要更改當前進程中的目錄,請使用chdir()
。
不,它不是,它是沒有用的。 chdir
(更改進程當前目錄的函數)僅影響調用它的進程(及其子進程)。它不會特別影響其父母。
因此exec
ing cd
沒有意義,因爲進程在更改目錄後會立即退出。
(你可以Exec的像bash -c cd /tmp
如果你真的想要,但正如我所說,這是徒勞的。)
雖然如前所述system("cd xxx")
不會改變您的應用程序當前目錄,但它並不完全無用。
您仍然可以使用系統退出狀態來了解將當前目錄更改爲所指定的目錄是否成功。
同樣,如果你喜歡複雜的解決方案,你也可以做叉/ 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的情況。
獨立的'cd'可執行文件是不可能的。 – glglgl 2012-03-25 13:41:02
在我使用的操作系統上肯定有一個。 – jlliagre 2012-03-25 13:50:57
@jliagre:用指針備份最後一段。例如。鏈接到http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html的末尾,據說所有的標準工具,包括常規的內置工具[...],應該是以某種方式實現,以便可以通過exec系列功能*訪問它們。並且對於Solaris的cd man http://docs.oracle.com/cd/E19253-01/816-5165/6mbb0m9bl/index.html,表示*/usr/bin/cd對調用過程沒有影響,但可以使用以確定是否可以將給定目錄設置爲當前目錄* – adl 2012-03-25 14:40:55
當一個分支完成後,子進程從父進程繼承環境變量CWD(當前工作目錄)。如果fork和exec像平常一樣完成,那麼子進程調用chdir(),只是將目錄更改爲新目錄並退出,但這不會影響父級。因此,新環境會丟失。
你可以通過參數代表什麼? – User 2015-03-16 04:20:04
@User:參數構成了正在執行的命令,由於這是一個變量參數函數,所以我們必須以某種方式指示參數的結束,在這種情況下,這是由類型爲const char的空指針完成的*'。所以執行的命令是:'/ bin/sh -c cd' – 2015-03-16 09:21:31