在 Linux 中获取主目录

2024-10-14 08:40:00
admin
原创
210
摘要:问题描述:我需要一种方法来获取在 Linux 上运行的 C++ 程序中的用户主目录。如果相同的代码可以在 Unix 上运行,那就太好了。我不想使用 HOME 环境值。据我所知,根主目录是 /root。如果我的程序由 root 用户运行,是否可以在此目录中创建一些文件/文件夹?解决方案 1:您需要getuid获...

问题描述:

我需要一种方法来获取在 Linux 上运行的 C++ 程序中的用户主目录。如果相同的代码可以在 Unix 上运行,那就太好了。我不想使用 HOME 环境值。

据我所知,根主目录是 /root。如果我的程序由 root 用户运行,是否可以在此目录中创建一些文件/文件夹?


解决方案 1:

您需要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:

您应该首先检查$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 基本目录规范。 例如,如果您想为您的应用程序创建一个配置目录,您应该首先检查$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
");
    else {
        errno = s;
        perror("getpwnam_r");
    }
    exit(EXIT_FAILURE);
}
char *homedir = result.pw_dir;

解决方案 3:

你可以使用这个代码在 C++ 中获取主目录

std::string home_dir = getenv("HOME");

解决方案 4:

如果您以 root 身份运行该程序,那么您将拥有此目录的 rwx 访问权限。我认为在里面创建东西是没问题的。

解决方案 5:

我需要从 sudo 下获取用户的主目录。我这样做了:

#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char *homedir = NULL;

void main(void)
{
    if ((homedir = getenv("SUDO_USER")) != NULL) 
    {
        homedir = getpwnam(homedir)->pw_dir;
        printf("HOME DIR: %s
", homedir);
    }

    return;
}
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1124  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   79  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   70  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   82  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   74  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用