2012-01-21 1 views
9

프로그램에서 환경 (getenv, ...)을 사용하지 않고 실제 "사용자 이름"을 어떻게 얻을 수 있습니까?Linux의 C/C++에서 사용자 이름을 얻는 방법은 무엇입니까?

+1

c와 C++ 기능의 차이점은 무엇입니까? 당신은 클래스 방법을 의미합니까 ?? – AlexTheo

+0

난 단지 C 함수를 사용하지 말아야한다. – Zat42

+8

POSIX API는 모두 C 함수로 정의되며, C++에서 모두 똑같이 호출 될 수있다. 나는 당신의 제한을 이해하지 못합니다. – spatz

답변

36

getlogin_r()unistd.h에 정의 된 함수 너를 돌려 준다. sername. 자세한 내용은 man getlogin_r을 참조하십시오.

그것의 서명은 다음과 같습니다

int getlogin_r(char *buf, size_t bufsize); 

없이 말을,이 기능이 그냥 간단하게 C 또는 C++로 호출 할 수 있습니다.

+7

@ Armed9Gagger, POSIX에 정의 된 API에 대한 C++ 라이브러리가 없습니다.C++은 * POSIX 함수를 사용하기로되어 있습니다 *. – spatz

+3

주 getlogin_r은 프로세스의 제어 터미널에 로그인 한 사용자의 이름을 반환합니다. 이것은 작업이 실행중인 사용자와 다를 수 있습니다. 이 기능은 제어 터미널에 연결되어 있지 않은 경우에도 실패합니다 (예 : 프로세스가 디먼으로 처리 될 때). –

+0

getlogin() 더 간단합니다 – rohitsakala

25

http://www.unix.com/programming/21041-getting-username-c-program-unix.html에서 :

/* whoami.c */ 
#define _PROGRAM_NAME "whoami" 
#include <stdlib.h> 
#include <pwd.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    register struct passwd *pw; 
    register uid_t uid; 
    int c; 

    uid = geteuid(); 
    pw = getpwuid (uid); 
    if (pw) 
    { 
     puts (pw->pw_name); 
     exit (EXIT_SUCCESS); 
    } 
    fprintf (stderr,"%s: cannot find username for UID %u\n", 
     _PROGRAM_NAME, (unsigned) uid); 
    exit (EXIT_FAILURE); 

} 

그냥 메인 라인을 가지고 수업을 캡슐화 : 만 C를 들어

class Env{ 
    public: 
    static std::string getUserName() 
    { 
     register struct passwd *pw; 
     register uid_t uid; 
     int c; 

     uid = geteuid(); 
     pw = getpwuid (uid); 
     if (pw) 
     { 
       return std::string(pw->pw_name); 
      } 
     return std::string(""); 
    } 
}; 

:

const char *getUserName() 
{ 
    uid_t uid = geteuid(); 
    struct passwd *pw = getpwuid(uid); 
    if (pw) 
    { 
    return pw->pw_name; 
    } 

    return ""; 
} 
+5

모든 C 함수 *가 아니라 C * 표준 라이브러리 *를 사용할 수있는 가능성이있다. 작업을 수행하기 위해 C 함수를 직접 또는 간접적으로 사용해야합니다. – Kos

+0

유익하기 때문에, 프로그램에 endpwent() 호출이 누락되지 않았습니까? –

+0

맞습니다. 고맙습니다. 코드를 업데이트하겠습니다. –

관련 문제