侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 238 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

getcwd函数用法详解

noerror
2022-11-09 / 0 评论 / 0 点赞 / 15 阅读 / 1,401 字 / 正在检测是否收录...

getcwd函数用法详解

getcwd函数简介

  • 头文件包含
#include <unistd.h>
  • 函数定义
char *getcwd(char * buf , size_t  size );
char *getwd(char * buf );
char *get_current_dir_name(void);

getcwd函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘getcwd’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <unistd.h>

getcwd函数详细描述

这些函数返回一个以null结尾的字符串,其中包含一个绝对路径名,该路径名是调用进程的当前工作目录。路径名作为函数结果返回,如果存在,则通过参数buf 返回。
getcwd ()函数将当前工作目录的绝对路径名复制到buf 所指向的长度为size 的数组中
如果当前工作目录的绝对路径名的长度(包括终止的null字节)超过size字节,则返回null,并将errno设置为ERANGE ;,应用程序应该检查此错误,并在必要时分配更大的缓冲区。
作为POSIX.1-2001标准的扩展,如果buf为空,glibc的getcwd ()使用malloc (3)动态分配缓冲区。在这种情况下,分配的缓冲区的长度为size,除非size为零,此时buf被分配为必要的大小。调用者应该free (3)返回的缓冲区。
get_current_dir_name ()将malloc (3)一个足够大的数组来保存当前工作目录的绝对路径名。如果设置了环境变量 PWD ,并且它的值是正确的,那么将返回该值。调用者应该free (3)返回的缓冲区。
getwd ()不malloc (3)任何内存。buf参数应该是指向长度至少为 PATH_MAX 字节的数组的指针。如果当前工作目录的绝对路径名的长度,包括终止的null字节,超过 PATH_MAX 字节,则返回null,errno设置为ENAMETOOLONG (注意,在某些系统上, PATH_MAX 可能不是编译时常量;此外,它的值可能取决于文件系统,出于可移植性和安全性的原因,请参见pathconf (3)),不推荐使用getwd ()。

getcwd函数返回值

如果成功,这些函数将返回一个指向包含当前工作目录路径名的字符串的指针。在getcwd ()和getwd ()的情况下,该值与buf 的值相同
失败时,这些函数返回NULL,并将errno设置为指示错误。buf指向的数组的内容在出错时未定义。

getcwd函数错误码

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

getcwd函数其他说明

在Linux下,这些函数使用getcwd ()系统调用(从Linux 2.1.92开始可用)。在较旧的系统上,如果系统调用和proc文件系统都丢失,他们会查询/proc/self/cwd ,调用一个通用实现。只有在这种情况下,这些调用才会在带有EACCES 的Linux下失败
这些函数通常用于保存当前工作目录的位置,以便以后返回。正在打开当前目录(“.”)当有足够多的文件描述符可用时,调用fchdir (2)返回通常是一种更快、更可靠的替代方法,尤其是在Linux以外的平台上。C library/kernel differences在Linux上,内核提供了一个getcwd ()系统调用,如果可能的话,本页描述的函数将使用它。系统调用采用与同名库函数相同的参数,但最多只能返回PATH_MAX字节。(在Linux 3.12之前,对返回路径名大小的限制是系统页面大小。在许多体系结构中,PATH_MAX和系统页面大小都是4096字节,但少数体系结构的页面大小更大。)如果当前工作目录的路径名长度超过此限制,则系统调用失败,并出现错误ENAMETOOLONG 。在这种情况下,库函数退回到返回完整路径名的(较慢的)替代实现。
在Linux 2.6.36中进行更改后,如果当前目录不在当前进程的根目录之下(例如,因为进程使用chroot (2)设置了新的文件系统根目录,而没有将其当前目录更改为新根目录),getcwd ()系统调用返回的路径名将以字符串“(unreachable)”为前缀。非特权用户将当前目录更改为另一个挂载命名空间也可能导致这种行为。当处理来自不可信来源的路径名时,本页中描述的函数的调用者应该考虑检查返回的路径名是以“/”还是“(”开头,以避免将不可访问的路径误解为相对路径名。

0

评论区