在 Linux 中获取主目录
- 2024-10-14 08:40:00
- admin 原创
- 263
问题描述:
我需要一种方法来获取在 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;
}
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD