2009-07-23 14 views
5

我知道有可能通過realpath()函數獲取文件的絕對路徑。但是,根據bugs部分的manpage,它的實現有一些問題。詳細情況如下:如何在linux下使用realpath()以編程方式獲取文件的絕對路徑?


BUGS使用此功能

避免。它由於設計而中斷(除非使用非標準resolved_pa​​th == NULL功能),因此無法爲輸出緩衝區resolve_path確定合適的大小。根據POSIX,一個PATH_MAX大小的緩衝區就足夠了,但是PATH_MAX不需要是一個定義的常量,並且可能必須使用pathconf(3)來獲得。並且詢問pathconf(3)並沒有真正的幫助,因爲一方面POSIX警告pathconf(3)的結果可能很大並且不適合mallocing內存。另一方面,pathconf(3)可能返回-1來表示PATH_MAX沒有界限。

libc4和libc5實現包含緩衝區溢出(在libc-5.4.13中修復)。因此,像mount(8)這樣的set-user-ID程序需要一個私有版本。


所以,問題是什麼是獲得文件的絕對路徑的最佳做法?

+0

複製「[編程式檢索OS X命令行應用程序的絕對路徑](http://stackoverflow.com/questions/799679/programatically-retrieving-the-absolute-path-of-an-os-的x命令行應用內)「? – bortzmeyer 2009-07-23 19:45:38

+0

不,他們不是一回事。我想知道如何獲得普通文件的絕對路徑,而不是可執行文件的路徑。 – jcadam 2009-07-24 15:12:26

回答

2

從shell中,我可以使用readlink -f $FILE獲得完整路徑。 glibc中有一個readlink()函數,可能會幫助你。

# man 2 readlink 
+0

我已閱讀coreutils包中的readlink命令的源代碼。有一個簡單的解決方案 - 只需將PATH_MAX定義爲1024! -__-! – jcadam 2009-07-23 14:42:16

3

使用getcwd()和readlink(),它允許給出一個緩衝區大小來重新實現realpath()。請注意,您必須解析符號鏈接,「。」和「..」從左到右做正確。

5

我知道這個問題已經過時了,但我沒有看到任何解決核心問題的答案:至少有兩個原因引用的手冊頁OP是錯誤和過時的。

一個是POSIX 2008添加/強制支持NULL參數選項,realpath爲您分配字符串。使用此功能的程序可以移植到GNU/Linux的所有相關版本,可能是大多數其他現代系統以及符合POSIX 2008的任何程序。

手冊頁錯誤的第二個原因是針對PATH_MAX的警告。這純粹是GNU宗教意識形態反對「任意限制」。在現實世界中,沒有路徑名長度限制會爲濫用/ DoS添加各種途徑,會給失敗的任務添加大量失敗案例,並且會破壞更多的接口,而不僅僅是realpath

如果你關心最大的便攜性,最好使用這兩種方法的組合。參見POSIX文檔細節:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/realpath.html

我會用一個固定大小,調用者提供的緩衝如果PATH_MAX被定義,否則通過NULL。這似乎涵蓋了所有情況,但您可能還想檢查舊版本的POSIX,看看他們是否有任何指導方針,如果未定義PATH_MAX,該怎麼辦。

相關問題