You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust中获取进程调用目录且不解析符号链接(跨平台)

获取进程调用时的原始工作目录(不解析符号链接)

可以实现,但不同操作系统的处理方式存在差异,以下是分平台的解决方案及注意事项:

核心需求说明

你需要的是进程启动时的当前工作目录(CWD)的逻辑路径——即用户实际进入的路径(包含符号链接),而非解析符号链接后的真实物理路径。


分平台实现方案

Linux

Linux没有直接提供系统调用返回逻辑路径,需依赖Shell设置的PWD环境变量(该变量会记录用户通过cd进入的逻辑路径),同时需要验证变量的有效性:

  1. 读取PWD环境变量;
  2. 通过stat分别校验PWD指向的路径与当前目录.的inode和设备号是否一致,确保PWD未被篡改;
  3. 若PWD无效或不存在,回退使用getcwd()(此时会返回解析后的真实路径)。

macOS

macOS的getcwd()函数提供了GCWD_NOFOLLOW参数,直接调用即可获取不解析符号链接的逻辑路径,无需依赖环境变量。

Windows

Windows的GetCurrentDirectory()函数默认返回逻辑路径,会保留用户进入的符号链接目录名称,无需额外处理。也可读取CD环境变量(由Windows Shell设置),但GetCurrentDirectory()更可靠。


跨平台代码示例(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __linux__
#include <unistd.h>
#include <sys/stat.h>
#elif __APPLE__
#include <unistd.h>
#include <sys/param.h>
#elif _WIN32
#include <windows.h>
#endif

char* get_logical_cwd(char* buf, size_t size) {
#ifdef __linux__
    const char* pwd = getenv("PWD");
    if (pwd != NULL) {
        struct stat pwd_stat, cwd_stat;
        // 校验PWD路径的有效性
        if (stat(pwd, &pwd_stat) == 0 && stat(".", &cwd_stat) == 0) {
            if (pwd_stat.st_dev == cwd_stat.st_dev && pwd_stat.st_ino == cwd_stat.st_ino) {
                strncpy(buf, pwd, size - 1);
                buf[size - 1] = '\0';
                return buf;
            }
        }
    }
    // 回退到真实路径
    return getcwd(buf, size);
#elif __APPLE__
    // 使用GCWD_NOFOLLOW获取逻辑路径
    return getcwd(buf, size, GCWD_NOFOLLOW);
#elif _WIN32
    if (GetCurrentDirectory(size, buf) != 0) {
        return buf;
    }
    return NULL;
#endif
}

int main() {
    char buf[PATH_MAX];
    if (get_logical_cwd(buf, sizeof(buf)) != NULL) {
        printf("逻辑工作目录:%s\n", buf);
    } else {
#ifdef _WIN32
        printf("获取逻辑工作目录失败,错误码:%d\n", GetLastError());
#else
        perror("获取逻辑工作目录失败");
#endif
        return 1;
    }
    return 0;
}

注意事项

  • Linux下:若程序不是通过Shell启动(如直接调用exec系统调用),PWD环境变量可能不存在或无效,此时会返回解析后的真实路径;
  • macOS下:GCWD_NOFOLLOW参数仅支持macOS 10.10及以上版本,旧版本需依赖PWD环境变量做兼容;
  • Windows下:目录符号链接的创建需要管理员权限,但读取逻辑路径无需特殊权限。

内容的提问来源于stack exchange,提问作者Hate9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:53:29