programing

Linux에서 홈 디렉터리 가져오기

newsource 2022. 8. 8. 20:36

Linux에서 홈 디렉터리 가져오기

Linux에서 실행되는 C++ 프로그램에서 사용자 홈 디렉토리를 가져오는 방법이 필요합니다.Unix에서도 같은 코드가 동작한다면 좋을 것 같습니다.나는 HOME 환경 값을 사용하고 싶지 않다.

AFAIK, 루트 홈 디렉토리는 /root입니다.root 사용자가 프로그램을 실행하고 있는 경우 이 디렉토리에 파일/폴더를 생성해도 될까요?

당신은 필요하다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대신.

먼저 다음 사항을 확인해야 합니다.$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)man 페이지):

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;

프로그램을 루트로 실행 중인 경우 이 디렉토리에 대한 rwx 액세스 권한이 있습니다.그 안에서 뭔가를 만들어 내는 것도 괜찮을 것 같아요.

언급URL : https://stackoverflow.com/questions/2910377/get-home-directory-in-linux