首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getcwd() vs get_current_dir_name()?

getcwd() vs get_current_dir_name()?
EN

Stack Overflow用户
提问于 2021-01-13 12:29:53
回答 1查看 1K关注 0票数 1

使用getcwd(NULL, 0)还是get_current_dir_name()更好?什么是常见的做法?

我不知情的猜测是,调用getcwd(NULL, 0)可能是一个更好的主意,因为可能PWD变量没有设置.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-13 12:37:56

使用getcwd(NULL, 0)还是get_current_dir_name()更好?什么是常见的做法?

这是特定于操作系统的。我猜你用的是Linux。

然后,阅读系统(2)getcwd(3)。研究其在GNU libcmusl libc中实现的源代码。

请注意

  • getcwd接受给定大小的缓冲区。实际上,256字节可能足够多,但原则上缓冲区应该大得多。见sysconf(3)路径(3)。接受getcwd(NULL,0)是一个相当于get_current_dir_name()的扩展,因此使用malloc并可能失败。我的Debian计算机在/usr/include/linux/limits.h中有一个宏定义的#define PATH_MAX 4096 (但是4096,当用作某些自动变量的大小时,对于任何递归函数的呼叫帧来说都是非常重要的;也可以查看nftw(3))。
  • getwd是过时的,因为它容易发生缓冲区溢出。不要在2021年使用它。
  • get_current_dir_name使用可能失败的malloc(3)

getcwd(3)不应该使用PWD环境变量。如果您使用它来编写您自己的/sbin/init,它应该可以工作。

有时,您可以启动运行/bin/bash而不是/sbin/init的Linux内核。在这种情况下,不设置PWD环境变量。见环境(7)全权证书(7)

当然,在大多数其他程序中,PWD是正确设置的(例如,通过GNU bash,您可以学习它的源代码,因为它是自由软件)。

我个人的建议

  • 假设并记录您的程序不会为大于256个字节的文件路径运行(但要注意2021年的UTF 8无处不在 )。对于使用UUID字符串或多个IPV6地址生成的文件名,这种假设可能是错误的,您可能希望在下面的path中使用C动态内存分配 .所以几乎相当于get_current_dir_name。别忘了free它!
  • 代码类似于: char path256;memset (路径,0,sizeof(path));if (getcwd(path,sizeof(path)) == NULL) { perror("getcwd");exit(EXIT_FAILURE);//或abort() }

当然,如果为某些机器人编写init-like程序,这还不够好。火星上的机器人可能会产生长路径名称!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65702034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档