2012-01-21 22 views
9

किसी प्रोग्राम में पर्यावरण (getenv, ...) का उपयोग किए बिना मुझे वास्तविक "उपयोगकर्ता नाम" कैसे प्राप्त हो सकता है?लिनक्स में सी/सी ++ में उपयोगकर्ता नाम कैसे प्राप्त करें?

+1

सी और सी ++ फ़ंक्शन के बीच क्या अंतर है? क्या आपका मतलब क्लास विधि है ?? – AlexTheo

+0

मुझे सिर्फ सी फ़ंक्शन का उपयोग नहीं करना है – Zat42

+8

सभी POSIX API को C फ़ंक्शंस के रूप में परिभाषित किया गया है, जिसे सी ++ में समान कहा जा सकता है। मैं आपके प्रतिबंध को समझ नहीं पा रहा हूं। – spatz

उत्तर

36

समारोह getlogin_r()unistd.h में परिभाषित किया गया आपको वापस आता है sername। अधिक जानकारी के लिए man getlogin_r देखें।

इसकी हस्ताक्षर है: कहने के लिए

int getlogin_r(char *buf, size_t bufsize); 

जरूरत नहीं, इस समारोह बस के रूप में आसानी से सी या C++ कहा जा सकता है।

+7

@ Armed9Gagger, इन चीजों के लिए C++ लाइब्रेरी में कोई एपीआई नहीं है जिसे POSIX में परिभाषित किया गया है।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); 

} 

बस मुख्य लाइनों लेने के लिए और कक्षा में यह संपुटित:

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

संभावना है कि आप सी * मानक पुस्तकालय *, नहीं * सभी सी कार्यों * का उपयोग नहीं कर सकते हैं। आपको अपना कार्य करने के लिए सीधे या परोक्ष रूप से सी कार्यों का उपयोग करने की आवश्यकता है। – Kos

+0

पैडेंटिक होने के लिए, क्या आपका प्रोग्राम एक अंतराल() कॉल नहीं है? –

+0

सही, धन्यवाद, मैं कोड अपडेट करूंगा। –

संबंधित मुद्दे