如何在linux下使用realpath()以编程方式获取文件的绝对路径?

前端之家收集整理的这篇文章主要介绍了如何在linux下使用realpath()以编程方式获取文件的绝对路径?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我知道可以使用realpath()函数获取文件绝对路径.但是,根据BUGS部分的手册页,其实现存在一些问题.详情如下:

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程序需要私有版本.

那么,问题是获取文件绝对路径的最佳实践是什么?

最佳答案
我知道这个问题已经过时了,但我没有看到解决核心问题的任何答案:引用的手册页OP错误且过时,至少有两个原因.

一个是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该怎么办.

猜你在找的Linux相关文章