我知道可以使用realpath()函数获取文件的绝对路径.但是,根据BUGS部分的手册页,其实现存在一些问题.详情如下:
BUGS
避免使用此功能.它被设计破坏了(因为除非使用非标准的resolved_path == 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程序需要私有版本.
一个是POSIX 2008添加/强制支持NULL参数选项,即realpath为您分配字符串.使用此功能的程序可以移植到GNU / Linux的所有相关版本,可能是大多数其他现代系统,以及任何符合POSIX 2008的版本.
手册页错误的第二个原因是对PATH_MAX的警告.这纯粹是反对“任意限制”的GNU宗教意识形态.在现实世界中,没有路径名长度限制会增加滥用/ DoS的各种途径,会给那些本来不会失败的任务增加许多失败案例,并且会破坏比真实路径更多的接口.
如果您关心最大可移植性,最好使用两种方法的混合.有关详细信息,请参阅POSIX文档:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/realpath.html
如果定义了PATH_MAX,我将使用固定大小的调用者提供的缓冲区,否则传递NULL.这似乎涵盖了所有情况,但您可能还想检查旧版本的POSIX,看看他们是否有任何指导如果没有定义PATH_MAX该怎么办.