代码之家  ›  专栏  ›  技术社区  ›  Alex F

Linux中的get home目录

  •  55
  • Alex F  · 技术社区  · 14 年前

    我需要一种在Linux上运行C++程序的用户主目录的方法。如果相同的代码在Unix上工作,那就更好了。我不想使用家庭环境价值。

    afaik,根主目录是/root。在根用户运行我的程序的情况下,是否可以在此目录中创建一些文件/文件夹?

    3 回复  |  直到 6 年前
        1
  •  84
  •   R Samuel Klatchko    14 年前

    你需要 getuid 获取当前用户的用户ID,然后 getpwuid 要获取该用户的密码项(包括主目录),请执行以下操作:

    #include <unistd.h>
    #include <sys/types.h>
    #include <pwd.h>
    
    struct passwd *pw = getpwuid(getuid());
    
    const char *homedir = pw->pw_dir;
    

    注意:如果您在线程应用程序中需要此功能,则需要使用 getpwuid_r 相反。

        2
  •  54
  •   9999years    6 年前

    你应该先检查一下 $HOME 环境变量,如果不存在,则使用getpwuid。

    #include <unistd.h>
    #include <sys/types.h>
    #include <pwd.h>
    
    const char *homedir;
    
    if ((homedir = getenv("HOME")) == NULL) {
        homedir = getpwuid(getuid())->pw_dir;
    }
    

    另外请注意,如果您希望主目录将配置或缓存数据存储为您编写的程序的一部分,并希望将其分发给用户,则应考虑遵循 XDG Base Directory Specification . 例如,如果要为应用程序创建配置目录,应首先检查 $XDG_CONFIG_HOME 使用 getenv 如上图所示,只有在变量未设置时才返回到上面的代码。

    如果需要多线程安全,则应使用 getpwuid_r 而不是 getpwuid 像这样(从 getpwnam(3) 人页):

    struct passwd pwd;
    struct passwd *result;
    char *buf;
    size_t bufsize;
    int s;
    bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    if (bufsize == -1)
        bufsize = 0x4000; // = all zeroes with the 14th bit set (1 << 14)
    buf = malloc(bufsize);
    if (buf == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    s = getpwuid_r(getuid(), &pwd, buf, bufsize, &result);
    if (result == NULL) {
        if (s == 0)
            printf("Not found\n");
        else {
            errno = s;
            perror("getpwnam_r");
        }
        exit(EXIT_FAILURE);
    }
    char *homedir = result.pw_dir;
    
        3
  •  0
  •   Anthony Atmaram    14 年前

    如果您以根目录的形式运行程序,那么您将拥有对该目录的RWX访问权。我想,在里面创造东西是可以的。