getcwd(NULL, 0)使用或更好吗get_current_dir_name()?常见做法是什么?
我不知情的猜测是,调用getcwd(NULL, 0)可能是一个更好的主意,因为 PWD 变量可能未设置......
getcwd(NULL, 0)使用或更好吗get_current_dir_name()?常见做法是什么?
然后,阅读syscalls(2)和getcwd(3)。研究其在GNU libc或musl 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,您可以研究其源代码,因为它是免费软件)
我个人的推荐
假设并记录您的程序无法在大于 256 字节的文件路径下运行(但请注意UTF 8 在 2021 年将无处不在)。对于使用UUID字符串或多个IPV6地址生成的文件名,此假设可能是错误的,并且您可能希望在下面使用C 动态内存分配path......因此几乎相当于get_current_dir_name. 别忘了free!
代码如下:
char path[256];
memset (path, 0, sizeof(path));
if (getcwd(path, sizeof(path)) == NULL) {
perror("getcwd");
exit(EXIT_FAILURE); // or abort()
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您init为某个机器人编写类似的程序,那么这还不够好。火星上的机器人可能会生成很长的路径名!