Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在linux下使用realpath()以编程方式获取文件的绝对路径?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我知道可以使用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该怎么办.

@H_772_48@

大佬总结

以上是大佬教程为你收集整理的如何在linux下使用realpath()以编程方式获取文件的绝对路径?全部内容,希望文章能够帮你解决如何在linux下使用realpath()以编程方式获取文件的绝对路径?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。