Сначала вы должны проверить переменную окружения $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\n");
else {
errno = s;
perror("getpwnam_r");
}
exit(EXIT_FAILURE);
}
char *homedir = result.pw_dir;