电话
400 9058 355
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 != ERANGE) 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/ 这类固定位置。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...