2012-01-21 14 views
9

Jak mogę uzyskać aktualną "nazwę użytkownika" bez korzystania ze środowiska (getenv, ...) w programie?Jak uzyskać nazwę użytkownika w C/C++ w systemie Linux?

+1

Czym różni się funkcja c i C++? Czy masz na myśli metodę klasową? – AlexTheo

+0

Po prostu nie używaj funkcji c. – Zat42

+8

Wszystkie funkcje POSIX API są zdefiniowane jako funkcje C, które można nazwać w C++. Nie rozumiem twoich ograniczeń. – spatz

Odpowiedz

36

Funkcja getlogin_r() zdefiniowane w unistd.h zwraca u seronim. Aby uzyskać więcej informacji, patrz man getlogin_r.

Jego podpis jest:

int getlogin_r(char *buf, size_t bufsize); 

trzeba dodawać, że funkcja ta może równie dobrze być nazywane w języku C lub C++.

+7

@ Armed9Gagger, w bibliotece C++ nie ma API dla tych rzeczy, które są zdefiniowane w POSIX.C++ jest * przypuszczalnie * używać funkcji POSIX. – spatz

+3

Uwaga getlogin_r zwraca nazwę użytkownika zalogowanego do kontrolującego terminalu procesu. Może się to różnić od użytkownika, dla którego zadanie jest uruchomione. Ta funkcja również nie powiedzie się, jeśli nie jest się przyłączonym do terminala sterującego (np. Gdy proces jest demonfigurowany). –

+0

getlogin() to jest prostsze. – rohitsakala

25

Od 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); 

} 

Wystarczy wziąć główne linie i otaczać go w klasie:

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(""); 
    } 
}; 

Dla C tylko:

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

    return ""; 
} 
+5

Jest szansa, że ​​nie można używać standardowych bibliotek C * *, a nie * wszystkich funkcji C *. Jesteś zobowiązany do bezpośredniego lub pośredniego korzystania z funkcji C, aby wykonać swoje zadanie. – Kos

+0

Być pedantyczny, czy twój program nie ma wywołania endpwent()? –

+0

Prawidłowo, dziękuję, zaktualizuję kod. –

Powiązane problemy