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?
risposta
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++.
@ Armed9Gagger, non ci sono API nella libreria C++ per queste cose che sono definite in POSIX.Il C++ è * supposto * usare le funzioni POSIX. – spatz
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). –
getlogin() questo è più semplice – rohitsakala
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 "";
}
È 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
Per essere pedante, il tuo programma non ha una chiamata a endpwent()? –
Esatto, grazie, aggiornerò il codice. –
Qual è la differenza tra la funzione c e C++? Intendi il metodo di classe ?? – AlexTheo
Devo solo non usare la funzione c – Zat42
Tutte le API POSIX sono definite come funzioni C, che possono essere chiamate tutte uguali in C++. Non capisco la tua restrizione. – spatz