我需要一种方法来获取在Linux上运行的C ++程序中的用户主目录。如果相同的代码在Unix上运行,那就太好了。我不想使用HOME环境值。
AFAIK,root主目录是/ root。在我的程序由root用户运行的情况下,可以在此目录中创建一些文件/文件夹吗?
答案 0 :(得分:84)
您需要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
代替。
答案 1 :(得分:57)
您应首先检查$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;
答案 2 :(得分:0)
如果您以root身份运行该程序,那么您将拥有对该目录的rwx访问权限。我想,在里面创建东西很好。