2012-01-21 24 views
9

Bir programda çevreyi (getenv, ...) kullanmadan asıl "kullanıcı adı" nı nasıl edinebilirim?Linux'ta C/C++ kullanıcı adı nasıl edinilir?

+1

c ve C++ işlevi arasındaki fark nedir? Sınıf metodunu mu kastediyorsun? – AlexTheo

+0

Sadece c işlevi kullanmamalıyım – Zat42

+8

Tüm POSIX API'ları, C++ ile aynı şekilde çağrılabilen C işlevleri olarak tanımlanır. Kısıtlamayı anlamıyorum. – spatz

cevap

36

getlogin_r()unistd.h tanımlanan fonksiyon u döndürür ullanıcı Adı. Daha fazla bilgi için bkz. man getlogin_r.

Onun imzadır:

int getlogin_r(char *buf, size_t bufsize); 

Söylemeye gerek, bu işlev aynı kolaylıkla C++ veya C çağrılabilir.

+7

@ Armed9Gagger, POSIX'te tanımlanan bu şeylerin C++ kütüphanesinde API yoktur.C++, POSIX işlevlerini kullanmak için * varsayılır. – spatz

+3

Not getlogin_r, bir işlemin kontrol terminaline giriş yapan kullanıcının adını döndürür. Bu, işin çalıştığı kullanıcıdan farklı olabilir. Bu işlev, bir denetim uçbirimine bağlı değilseniz (ör., Bir süreç belirlendiğinde) başarısız olur. –

+0

getlogin() bu daha basit – rohitsakala

25

http://www.unix.com/programming/21041-getting-username-c-program-unix.html Gönderen:

/* 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); 

} 

Sadece ana hatlarını alıp sınıfta hapsetmek: Sadece C için

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

Şanslar C * standart kütüphaneleri kullanamazsınız *, * tüm C işlevleri *. Görevinizi gerçekleştirmek için doğrudan veya dolaylı olarak C işlevlerini kullanmanız gerekir. – Kos

+0

Pedantik olmak için, programınızın bir endpwent() çağrısı eksik değil mi? –

+0

Doğru, teşekkürler, kodu güncelleyeceğim. –

İlgili konular