加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-05-23 14:07:58 所属栏目:Linux 来源:互联网
导读:我知道可以使用realpath()函数获取文件的绝对路径.但是,根据BUGS部分的手册页,其实现存在一些问题.详情如下:BUGS避免使用此功能.它被设计破坏了(因为除非使用非标准的resolved_path == NULL特性),否则无法确定输出缓冲区resolve_path的合适大小.根据POSIX,大

我知道可以使用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程序需要私有版本.

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

最佳答案 我知道这个问题已经过时了,但我没有看到解决核心问题的任何答案:引用的手册页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该怎么办.

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读