REALPATH - Linux手册页

时间:2019-08-20 18:01:09  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2017-09-15

名称

realpath-返回规范化的绝对​​路径名

语法

#include <limits.h>
#include <stdlib.h>

char *realpath(const char *path, char *resolved_path);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

realpath():

_XOPEN_SOURCE>= 500 || / * Glibc自2.19起:* / -_DEFAULT_SOURCE || / * Glibc版本

说明

realpath()扩展所有符号链接,并解析对以path命名的以null终止的字符串中的/./、/../和其他aq / aq字符的引用,以生成规范化的绝对​​路径名。生成的路径名将以null终止的字符串形式存储(最多PATH_MAX个字节),存储在由resolve_path指向的缓冲区中。结果路径将没有符号链接,/。/或/../组件。

如果将resolve_path指定为NULL,则realpath()使用malloc(3)分配最多PATH_MAX字节的缓冲区以保存已解析的路径名,并返回指向该缓冲区的指针。调用者应使用free(3)释放此缓冲区。

返回值

如果没有错误,realpath()将返回一个指向resolve_path的指针。

否则,它返回NULL,数组resolve_path的内容未定义,并设置errno来指示错误。

错误说明

EACCES
路径前缀的一部分的读取或搜索权限被拒绝。
EINVAL
路径为NULL。 (在2.3之前的glibc版本中,如果resolve_path为NULL,也会返回此错误。)
EIO
从文件系统读取时发生I / O错误。
ELOOP
翻译路径名时遇到太多符号链接。
ENAMETOOLONG
路径名的一部分超过NAME_MAX个字符,或者整个路径名超过PATH_MAX个字符。
ENOENT
命名文件不存在。
ENOMEM
内存不足。
ENOTDIR
路径前缀的组成部分不是目录。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
realpath()Thread safetyMT-Safe

遵循规范

4.4 BSD,POSIX.1-2001。

POSIX.1-2001说,如果resolve_path为NULL,则行为是实现定义的。 POSIX.1-2008指定此页中描述的行为。

备注

在4.4BSD和Solaris中,路径名长度的限制为MAXPATHLEN(位于中)。 SUSv2规定了pathconf(3)函数中发现或提供的PATH_MAX和NAME_MAX。一个典型的源片段是

#ifdef PATH_MAX
  path_max = PATH_MAX;
#else
  path_max = pathconf(path, _PC_PATH_MAX);
  if (path_max <= 0)
    path_max = 4096;
#endif

(但请参阅"错误"部分。)

GNU extensions

如果调用失败并显示EACCES或ENOENT,并且resolve_path不为NULL,则在resolve_path中返回不可读或不存在的路径前缀。

BUGS

此功能的POSIX.1-2001标准版本在设计上已被破坏,因为无法确定输出缓冲区resolve_path的合适大小。根据POSIX.1-2001,大小为PATH_MAX的缓冲区就足够了,但是PATH_MAX不必是定义的常数,可能必须使用pathconf(3)获得。询问pathconf(3)并没有真正的帮助,因为POSIX一方面警告pathconf(3)的结果可能很大且不适合内存分配,另一方面,pathconf(3)可能会将-1返回到表示PATH_MAX没有边界。在POSIX.1-2001中未标准化但在POSIX.1-2008中标准化的resolve_path == NULL功能可以避免此设计问题。

另外参见

realpath(1),readlink(2),canonicalize_file_name(3),getcwd(3),pathconf(3),sysconf(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/