2012-01-21 5 views
9

Come posso ottenere il "nome utente" effettivo senza utilizzare l'ambiente (getenv, ...) in un programma?Come ottenere il nome utente in C/C++ in Linux?

+1

Qual è la differenza tra la funzione c e C++? Intendi il metodo di classe ?? – AlexTheo

+0

Devo solo non usare la funzione c – Zat42

+8

Tutte le API POSIX sono definite come funzioni C, che possono essere chiamate tutte uguali in C++. Non capisco la tua restrizione. – spatz

risposta

36

La funzione getlogin_r() definito in unistd.h restituisce il u sername. Vedi man getlogin_r per ulteriori informazioni.

la sua firma è:

int getlogin_r(char *buf, size_t bufsize); 

Inutile dire, questa funzione può altrettanto facilmente essere chiamato in C o C++.

+7

@ Armed9Gagger, non ci sono API nella libreria C++ per queste cose che sono definite in POSIX.Il C++ è * supposto * usare le funzioni POSIX. – spatz

+3

Nota getlogin_r restituisce il nome dell'utente registrato nel terminale di controllo di un processo. Questo potrebbe essere diverso da quello in cui il lavoro è in esecuzione. Questa funzione fallirà anche se non si è collegati a un terminale di controllo (ad es. Quando un processo è demonizzato). –

+0

getlogin() questo è più semplice – rohitsakala

25

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

} 

Basta prendere le linee principali e incapsulare in classe:

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

Per C solo:

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

    return ""; 
} 
+5

È probabile che non sia possibile utilizzare le librerie standard C * *, non * tutte le funzioni C *. Ti viene richiesto di utilizzare direttamente o indirettamente le funzioni C per svolgere il tuo compito. – Kos

+0

Per essere pedante, il tuo programma non ha una chiamata a endpwent()? –

+0

Esatto, grazie, aggiornerò il codice. –