




getcwd 是 POSIX 函数,用于获取当前工作目录而非可执行文件路径;需包含 (Linux/macOS)或 (Windows),传入缓冲区和长度,成功返回路径字符串,失败返回 nullptr 并设置 errno;推荐动态扩容缓冲区避免溢出,且注意其与 __FILE__、argv[0]、/proc/self/exe 等获取二进制路径方式的本质区别。
getcwd 是 POSIX 标准函数,C++ 本身不提供原生路径获取机制,需通过 (Linux/macOS)或 (Windows)引入。它返回当前工作目录(Current Working Directory, CWD),不是可执行文件所在目录,这点常被混淆。
典型用法是传入一个缓冲区和长度,函数填充路径字符串并返回该指针;失败时返回 nullptr,需检查 errno。
PATH_MAX 宏()作为长度参考,但注意它在某些系统(如 macOS)上可能未定义_getcwd,且头文件、链接行为与 POSIX 不同直接硬编码 PATH_MAX 或固定大小数组(如 char buf[4096])在嵌入式或容器环境里容易溢出。更稳妥的方式是动态分配:
#include#include #include #include std::string getCurrentWorkingDir() { std::unique_ptr buf; size_t size = PATH_MAX; while (true) { buf = std::make_unique (size); if (getcwd(buf.get(), size)) { return std::string(buf.get()); } if (errno != E RANGE) return ""; size *= 2; } }
这段代码会自动扩容直到成功,避免栈溢出和静态缓冲区风险。注意:Windows 需替换为 _getcwd 并包含 ,且返回值语义一致。
立即学习“C++免费学习笔记(深入)”;
常见错误现象:getcwd 返回 nullptr,errno 为 2(ENOENT),说明当前工作目录已被删除或不可访问 —— 比如进程启动后,其 CWD 被另一个程序 rm -rf 掉了,但进程仍可运行。
getcwd 失败,但 open(".", O_RDONLY) 仍可能成功chdir 回退到该路径,除非先 chdir 到一个现存父目录再逐级进入getcwd 返回的是进程启动时(或最后一次 chdir 后)的工作目录,和可执行文件位置完全无关。想获取二进制所在目录,不能靠它:
__FILE__ 是编译期字面量,展开为源码路径,不是运行时路径argv[0] 可能是相对路径、符号链接、甚至被篡改的字符串/proc/self/exe 读取真实路径;macOS 用 _NSGetExecutablePath;Windows 用 GetModuleFileNameA(nullptr, ...)
混淆这两类路径是线上服务加载配置失败的高频原因 —— 特别是在 systemd 或容器中启动时,CWD 往往是 / 或 /tmp,而配置文件实际放在 /app/config/ 这类固定位置。