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
'Nice programing' 카테고리의 다른 글
| Rails : Partials는 인스턴스 변수를 인식해야합니까? (0) | 2020.11.26 |
|---|---|
| iPhone의 StatusBar에보기 추가 (0) | 2020.11.26 |
| RSpec stubbed 메서드가 순서대로 다른 값을 반환 할 수 있습니까? (0) | 2020.11.26 |
| 웹 애플리케이션에서 Log4Net 구성 (0) | 2020.11.26 |
| 키 / 값 쌍을 얻기 위해 Javascript에서 JSON 응답 구문 분석 (0) | 2020.11.26 |