Next: , Previous: , Up: 程式行為   [目錄][索引]


4.6 尋找程式的可執行檔與相關檔案

程式可能需要找到啟動它的可執行檔,以便重新啟動同一個程式。它也可能需要找到相關檔案,無論是原始碼檔案或建置過程中產生的檔案,這些檔案會在執行時期使用。

尋找這些檔案的方法始於查看 argv[0]

如果該字串包含斜線,依照慣例,它會是可執行檔的檔案名稱,而其目錄部分則是包含該可執行檔的目錄。當程式不是透過 PATH 找到時,通常會是這種情況,這通常表示程式已被建置但未安裝,並從建置目錄執行。程式可以使用 argv[0] 檔案名稱來重新啟動自身,並在其目錄部分尋找相關檔案。如果該檔案名稱不是絕對路徑,則它是相對於程式啟動時的工作目錄。

如果 argv[0] 不包含斜線,它就是一個命令名稱,其可執行檔是透過 PATH 找到的。程式應該在 PATH 中的目錄裡搜尋該名稱,並將 . 解釋為程式啟動時的當前工作目錄。

如果此程序找到可執行檔,我們將找到它的目錄稱為調用目錄。程式應該檢查該目錄中是否存在它需要的相關檔案。

如果程式的可執行檔通常建置在主要建置目錄的子目錄中,且主要建置目錄包含相關檔案(可能包括子目錄),則程式應查看調用目錄的父目錄,檢查主要建置目錄應包含的相關檔案和子目錄。

如果調用目錄不包含所需的內容,但可執行檔名是符號連結,則程式應嘗試使用連結目標的所在目錄作為調用目錄。

如果此程序沒有找到有效的調用目錄(通常是透過 PATH 找到的已安裝程式的情況),程式應在程式的 makefile 安裝它們的目錄中尋找相關檔案。請參閱目錄變數

argv[0] 中提供有效資訊是一種慣例,而非保證。行為良好的程式(例如 shell)在啟動其他程式時會遵循此慣例;當您啟動其他程式時,您的程式碼也應遵循它。但始終有可能啟動程式並在 argv[0] 中提供無意義的值。

因此,任何需要知道其可執行檔位置或其它相關檔案位置的程式,都應提供使用者環境變數來明確指定這些位置。

請勿將特殊權限(例如透過 setuid 位元)授予那些以啟發式方法搜尋相關檔案或自身可執行檔的程式。應將此權限限制於在硬編碼的安裝位置(例如在 /usr/etc 下)尋找相關檔案的程式。

有關 PATH 的更多資訊,請參閱《Bash 參考手冊》中的 Bourne Shell 變數。


Next: , Previous: , Up: 程式行為   [目錄][索引]