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

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

概述我知道可以使用realpath()函数获取文件的绝对路径.但是,根据BUGS部分的手册页,其实现存在一些问题.详情如下: BUGS 避免使用此功能.它被设计破坏了(因为除非使用非标准的resolved_pa​​th == NULL特性),否则无法确定输出缓冲区resolve_path的合适大小.根据POSIX,大小为PATH_MAX的缓冲区就足够了,但PATH_MAX不必是定义的常量,可能必须使用 我知道可以使用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下使用realpath()以编程方式获取文件的绝对路径?全部内容,希望文章能够帮你解决如何在linux下使用realpath()以编程方式获取文件的绝对路径?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1030027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存