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
'programing' 카테고리의 다른 글
vue.js에 고정된 헤더가 있는 스틱 사이드바(jQuery 없음) (0) | 2022.08.08 |
---|---|
C 또는 C++를 사용하여 디렉토리 내의 파일 목록을 가져오려면 어떻게 해야 합니까? (0) | 2022.08.08 |
v-navigation-drawer가 닫힌 상태로 웹 사이트 로드 (0) | 2022.08.08 |
C의 숫자가 음수가 아니더라도 항상 'int'를 사용해야 합니까? (0) | 2022.08.08 |
vue-modal 드래그 가능 문제 (0) | 2022.08.07 |