getcwd() 与 get_current_dir_name()?

cas*_*ipe 2 c linux io

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

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

Bas*_*tch 5

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

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

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

请注意

  • getcwd获取给定已知大小的缓冲区。实际上,256 字节通常就足够了,但原则上缓冲区应该更大。请参阅sysconf(3)pathconf(3)。Acceptinggetcwd(NULL,0)是一个相当于get_current_dir_name()so 使用的扩展malloc,并且可能会失败。我的 Debian 计算机有/usr/include/linux/limits.h一个宏定义(但是 4096,当用作某些自动变量#define PATH_MAX 4096的大小时,对于任何递归函数的调用框架来说都很大;另请参阅nftw(3))。

  • getwd已过时,因为容易发生缓冲区溢出。2021 年不要使用它。

  • get_current_dir_name使用malloc(3)可能会失败。

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

有时,您可以启动运行的 Linux 内核/bin/bash而不是/sbin/init. 在这种情况下,PWD不会设置环境变量。请参阅environ(7)credentials(7)

当然,在大多数其他程序中,PWD是正确设置的(例如通过GNU bash,您可以研究其源代码,因为它是免费软件

我个人的推荐

当然,如果您init为某个机器人编写类似的程序,那么这还不够好。火星上的机器人可能会生成很长的路径名!

  • 我也相信这一点。每个进程的当前工作目录都是该进程元数据的一部分,因此由内核维护。我希望 `getcwd()` 和 `get_current_dir_name()` 在所有情况下都依赖于该元数据。 (2认同)
  • @Basile 我同意,但这纯粹是我的猜测,我不想做得太过分。— 我对你的 256 路径长度建议不太满意:这个数字*没有*理由,现在它严重不足(即使没有 UTF-8,也很容易超过它)。甚至(有问题的)“PATH_MAX”常量通常/经常/总是(?)设置为 4096。 (2认同)
  • @Basile 在我的域中,深度嵌套的文件路径通常由数据处理管道自动生成,并且经常包含 UUID 字符串。但即使对于常规的“手工”路径,在我的系统上也会达到 256 个字符(不是经常,而是定期)。我刚刚查了一下,发现了好几个。 (2认同)
  • POSIX [`<limits.h>`](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html) 中存在或可能存在宏 `PATH_MAX`,或者您可能需要使用 [`pathconf()`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pathconf.html) 来获取特定路径的实际限制(或使用 `_POSIX_PATH_MAX` 或可能 ` _XOPEN_PATH_MAX` 以获得静态限制)。无需猜测像 256 这样的限制。请注意,名称组件的大小还有“NAME_MAX”。POSIX 的下限为 256 和 14,X/Open 的下限为 1024 和 256。 (2认同)