GETCWD - Linux手册页

时间:2019-08-20 18:00:25  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2018-04-30

名称

getcwd,getwd,get_current_dir_name-获取当前工作目录

语法

#include <unistd.h>

char *getcwd(char *buf, size_t size);

char *getwd(char *buf);

char *get_current_dir_name(void);

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

get_current_dir_name():

_GNU_SOURCE

getwd():

Since glibc 2.12:
(_XOPEN_SOURCE >= 500) && ! (_POSIX_C_SOURCE >= 200809L)
    || /* Glibc since 2.19: */ _DEFAULT_SOURCE
    || /* Glibc versions <= 2.19: */ _BSD_SOURCE
Before glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE>= 500

说明

这些函数返回一个以空终止的字符串,其中包含一个绝对路径名,该绝对路径名是调用进程的当前工作目录。路径名将作为函数结果并通过参数buf(如果存在)返回。

getcwd()函数将当前工作目录的绝对路径名复制到buf指向的数组,该数组的长度为size。

如果当前工作目录的绝对路径名的长度(包括终止的空字节)超过大小字节,则返回NULL,并将errno设置为ERANGE;应用程序应检查此错误,并在必要时分配更大的缓冲区。

作为POSIX.1-2001标准的扩展,如果buf为NULL,则glibc的getcwd()使用malloc(3)动态分配缓冲区。在这种情况下,当分配buf必要时,除非大小为零,否则分配的缓冲区具有长度大小。调用者应释放(3)返回的缓冲区。

get_current_dir_name()将malloc(3)一个足以容纳当前工作目录的绝对路径名的数组。如果设置了环境变量PWD,并且其值正确,那么将返回该值。调用者应释放(3)返回的缓冲区。

getwd()不会malloc(3)任何内存。 buf参数应该是至少PATH_MAX个字节长的数组的指针。如果当前工作目录的绝对路径名(包括终止空字节)的长度超过PATH_MAX字节,则返回NULL,并将errno设置为ENAMETOOLONG。 (请注意,在某些系统上,PATH_MAX可能不是编译时常量;此外,其值可能取决于文件系统,请参见pathconf(3)。)出于可移植性和安全性的考虑,不建议使用getwd()。

返回值

成功执行后,这些函数将返回指向包含当前工作目录路径名的字符串的指针。对于getcwd()和getwd(),此值与buf相同。

失败时,这些函数将返回NULL,并且将errno设置为指示错误。错误时未定义buf指向的数组的内容。

错误说明

EACCES
拒绝读取或搜索文件名组成部分的权限。
EFAULT
buf指向错误的地址。
EINVAL
size参数为零,buf不是空指针。
EINVAL
getwd():buf为NULL。
ENAMETOOLONG
getwd():以空值结尾的绝对路径名字符串的大小超过PATH_MAX字节。
ENOENT
当前工作目录已取消链接。
ENOMEM
内存不足。
ERANGE
size参数小于工作目录的绝对路径名的长度,包括终止的空字节。您需要分配更大的数组,然后重试。

属性

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

InterfaceAttributeValue
getcwd(),getwd()Thread safetyMT-Safe
get_current_dir_name()Thread safetyMT-Safe env

遵循规范

getcwd()符合POSIX.1-2001。但是请注意,如果buf为NULL,则POSIX.1-2001会使getcwd()的行为保持不确定。

getwd()存在于POSIX.1-2001中,但标记为LEGACY。 POSIX.1-2008删除了getwd()的规范。请改用getcwd()。 POSIX.1-2001没有为getwd()定义任何错误。

get_current_dir_name()是GNU扩展。

备注

在Linux下,这些函数利用getcwd()系统调用(从Linux 2.1.92开始可用)。在较旧的系统上,他们将查询/ proc / self / cwd。如果缺少系统调用和proc文件系统,则将调用通用实现。只有在这种情况下,这些调用才能在具有EACCES的Linux下失败。

这些功能通常用于保存当前工作目录的位置,以便稍后返回到该目录。当有足够多的文件描述符可用时,尤其是在Linux以外的平台上,打开当前目录("。")并调用fchdir(2)返回通常是一种更快,更可靠的选择。

C library/kernel differences

在Linux上,内核提供了一个getcwd()系统调用,该页面中描述的功能将尽可能使用。系统调用采用与同名库函数相同的参数,但仅限于返回最多PATH_MAX字节。 (在Linux 3.12之前,返回的路径名大小的限制是系统页面大小。在许多体系结构上,PATH_MAX和系统页面大小均为4096字节,但是有些体系结构具有更大的页面大小。)当前工作目录的路径名超过了此限制,那么系统调用将失败,并显示错误ENAMETOOLONG。在这种情况下,库函数会退回到一个(较慢的)替代实现,该实现返回完整路径名。

在Linux 2.6.36中进行更改之后,如果当前目录不在当前进程的根目录下,则getcwd()系统调用返回的路径名将以字符串"(无法到达)"为前缀(例如,因为该进程使用chroot(2)设置新文件系统根目录,而无需将其当前目录更改为新根目录。非特权用户也可以通过将当前目录更改为另一个安装名称空间来引起这种行为。处理来自不受信任来源的路径名时,此页面中描述的函数的调用者应考虑检查返回的路径名是否以'/'或'('开头,以避免将无法访问的路径误解为相对路径名。

BUGS

由于Linux 2.6.36的更改在上述情况下添加了"(无法访问)",因此当API协定要求使用绝对路径名时,getcwd()的glibc实现无法遵循POSIX,并且返回了相对路径名。从glibc 2.27开始,此问题已得到纠正。从这样的路径名调用getcwd()现在将导致ENOENT失败。

另外参见

pwd(1),chdir(2),fchdir(2),open(2),unlink(2),free(3),malloc(3)

出版信息

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