Получить домашний каталог в Linux
Мне нужен способ получить домашний каталог пользователя в программе на С++, запущенной в Linux. Если тот же код работает в Unix, было бы неплохо. Я не хочу использовать значение среды HOME.
AFAIK, корневой домашний каталог -/root. Можно ли создать несколько файлов/папок в этом каталоге, если моя программа запущена пользователем root?
Ответы
Ответ 1
Вам нужно getuid
, чтобы получить идентификатор пользователя текущего пользователя, а затем 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 Base Directory. Например, если вы хотите создать каталог конфигурации для вашего приложения, вы должны сначала проверить $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
Если вы используете программу как root, тогда у вас будет доступ к rwx в этот каталог. Создание материала внутри него прекрасно, я полагаю.