2012-01-21 38 views
9

Làm cách nào để có được "tên người dùng" thực sự mà không sử dụng môi trường (getenv, ...) trong một chương trình?Cách lấy tên người dùng trong C/C++ trong Linux?

+1

Sự khác nhau giữa hàm c và C++ là gì? Bạn có nghĩa là phương pháp lớp ?? – AlexTheo

+0

Tôi chỉ cần không sử dụng chức năng c – Zat42

+8

Tất cả API POSIX được định nghĩa là hàm C, có thể được gọi là tất cả giống nhau trong C++. Tôi không hiểu giới hạn của bạn. – spatz

Trả lời

36

Chức năng getlogin_r() quy định tại unistd.h trả về bạn tên người dùng. Xem man getlogin_r để biết thêm thông tin.

chữ ký của nó là:

int getlogin_r(char *buf, size_t bufsize); 

Không cần phải nói, chức năng này có thể dễ dàng được gọi trong C hoặc C++.

+7

@ Armed9Gagger, không có API trong thư viện C++ cho những thứ này được xác định trong POSIX.C++ được * giả định * để sử dụng các chức năng POSIX. – spatz

+3

Lưu ý getlogin_r trả về tên của người dùng đăng nhập vào thiết bị đầu cuối điều khiển của một quá trình. Điều này có thể khác với người dùng mà công việc đang chạy. Chức năng này cũng sẽ thất bại nếu bạn không được gắn vào một thiết bị đầu cuối điều khiển (ví dụ, khi một quá trình được thực thi). –

+0

getlogin() điều này đơn giản hơn – rohitsakala

25

Từ 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); 

} 

Chỉ cần dòng chính và rút gọn trong lớp:

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

Đối với chỉ C:

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

    return ""; 
} 
+5

Rất có thể bạn không thể sử dụng thư viện chuẩn C * *, không phải * tất cả các chức năng C *. Bạn được yêu cầu trực tiếp hoặc gián tiếp sử dụng các hàm C để thực hiện nhiệm vụ của mình. – Kos

+0

Để trở thành thực tế, chương trình của bạn có thiếu một cuộc gọi endpwent() không? –

+0

Đúng, cảm ơn bạn, tôi sẽ cập nhật mã. –

Các vấn đề liên quan