Linux 程式常以相對路徑(如 ../src/config.xml)讀取配置文件。若工作目錄發生變更,相對路徑即失效,導致「找不到文件」錯誤。硬編碼絕對路徑又缺乏可移植性。最佳方案是:在程式啟動時動態解析自身所在目錄,構建配置文件的絕對路徑。
pid_t mypid = getpid();
char strsrc[PATH_MAX], strdest[PATH_MAX];
sprintf(strsrc, "/proc/%d/exe", mypid); // 注意:現代內核建議用 exe 而非 file
ssize_t len = readlink(strsrc, strdest, sizeof(strdest) - 1);
if (len != -1) {
strdest[len] = '\0';
// strdest 即為可執行文件絕對路徑
}
優點:無需參數傳遞,適用於共享庫加載場景。
缺點:依賴 procfs 掛載,非 Linux 平台不可移植;早期內核 /proc/pid/file 行為不一。
realpath() + dirname()(推薦,POSIX 兼容)char path[PATH_MAX];
char *rpath = realpath(argv[0], path); // 解析符號鏈接、相對路徑
if (rpath) {
char *dir = dirname(rpath); // 提取目錄部分
char conf_file[PATH_MAX];
snprintf(conf_file, sizeof(conf_file), "%s/../src/config.xml", dir);
// conf_file 即為目標絕對路徑
}
關鍵點:
argv[0] 可能包含相對路徑或僅文件名,realpath() 會展開為絕對路徑並解析符號鏈接。dirname() 可能修改輸入緩衝區,建議傳入副本或使用 dir = dirname(strdup(rpath)) 後 free()。_POSIX_C_SOURCE 200809L 或 _XOPEN_SOURCE 700 以獲取 PATH_MAX。getcwd())與「程式所在目錄」。argv[0] 為空或非路徑的情況(某些啟動器行為)。PATH_MAX 或動態分配。方法二憑藉標準化、可移植性、簡潔性,成為現代 Linux/C 開發的首選。僅在極端環境(如 procfs 未掛載、argv[0] 不可靠)下才考慮方法一或補充方案(如 dladdr() 獲取共享庫路徑)。
Linux 下 Live555 無法取得 IP 位址解決方案:固定 IP 與閘道設定
Linux screen 指令完整教學:終端機多工、斷線保護、會話共享與遠端協作實戰
Linux 開機啟動腳本機制深度解析:init、runlevel、rc.d 目錄結構與自定義服務排序
Linux 系統備份策略完整指南:從規劃、媒體選擇到 tar/cpio 實戰操作
Linux 核心模塊開發入門:初始化/清理函數、模塊授權與 printk 等級機制實作
Linux 網路設定全攻略:IP、DNS、閘道與路由修改指令大全