Nice programing

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

nicepro 2020. 11. 26. 19:54
반응형

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


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

AFAIK, 루트 홈 디렉토리는 / 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 기본 디렉토리 사양을 따르는 것을 고려해야합니다 . 예를 들어 애플리케이션에 대한 구성 디렉토리를 생성하려면 먼저 위에 표시된대로 $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;

프로그램을 루트로 실행하는 경우이 디렉토리에 대한 rwx 액세스 권한이 있습니다. 그 안에 물건을 만드는 것은 괜찮습니다.

참고 URL : https://stackoverflow.com/questions/2910377/get-home-directory-in-linux

반응형