우선 환경 변수 $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 다음 고려해야합니다, 당신이 원하는 경우 홈 디렉토리는 당신이 쓰는 프로그램의 한 부분으로 구성 또는 캐시 데이터를 저장하고 사용자에게 배포 할 것을주의. 예를 들어 응용 프로그램의 구성 디렉토리를 만들려면 위의 그림과 같이
getenv
을 사용하여
$XDG_CONFIG_HOME
을 먼저 확인하고 변수가 설정되지 않은 경우 위의 코드로 되돌아 가야합니다.
당신이 멀티 스레드 안전을 필요로하는 경우이 같은 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 = 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;
'~'그것입니다 아니? 'cd ~','mv some_file ~/some_file' 등. –
@NickBedford -'~'는 커널이나 libc가 아닌 쉘에 의해 구현됩니다. C++로 프로그래밍 할 때는 직접 구현해야합니다. –
@Samuel의 설명에 감사드립니다. –