Primero debe verificar la variable de entorno $HOME
, y si eso no existe, use getpwuid.
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
const char *homedir;
if ((homedir = getenv("HOME")) == NULL) {
homedir = getpwuid(getuid())->pw_dir;
}
También tenga en cuenta, que si se desea que el directorio principal para almacenar datos de configuración de caché o como parte de un programa que escribe y quiere distribuir a los usuarios, se debe considerar la siguiente XDG Base Directory Specification. Por ejemplo, si desea crear un directorio de configuración para su aplicación, primero debe marcar $XDG_CONFIG_HOME
usando getenv
como se muestra arriba y solo recurrir al código anterior si la variable no está configurada.
Si requiere de seguridad multi-hilo, se debe utilizar getpwuid_r
en lugar de getpwuid
como esto (desde la página getpwnam(3)
hombre):
struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1)
bufsize = 16384;
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;
directorio principal actual del usuario (no nombre) es '~' es lo ¿no? Como en 'cd ~', 'mv some_file ~/some_file' etc. –
@NickBedford -' ~ 'es implementado por el shell, no el kernel o libc. Cuando programe en C++, debe implementarlo usted mismo. –
@Samuel gracias por la aclaración. –