2012-01-21 12 views
9

プログラムで環境(getenv、...)を使用せずに実際の「ユーザー名」を取得するにはどうすればよいですか?LinuxのC/C++でユーザー名を取得する方法は?

+1

cとC++の違いは何ですか?あなたはクラスメソッドを意味しますか? – AlexTheo

+0

私はちょうどcの関数を使わないでください – Zat42

+8

POSIXのAPIはすべてCの関数として定義されていますが、これはC++でも同じように呼び出すことができます。私はあなたの制限を理解していません。 – spatz

答えて

36

getlogin_r()unistd.hで定義された関数あなたに返すsername。詳細については、man getlogin_rを参照してください。

そのシグネチャは次のとおりです。言うこと

int getlogin_r(char *buf, size_t bufsize); 

言うまでもなく、この機能は同じように簡単にCまたはC++で呼び出すことができます。

+7

@ Armed9Gaggerでは、POSIXで定義されているこれらのことについて、C++ライブラリにAPIはありません。C++は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); 

} 

ただ、メインラインを取り、クラスでそれをカプセル化:Cのみについて

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

すべてのC関数ではなく、C *標準ライブラリ*を使うことはできない可能性があります。タスクを実行するには、C関数を直接的または間接的に使用する必要があります。 – Kos

+0

あなたのプログラムがendpwent()呼び出しをしていないのではないかと思いますか? –

+0

正解、ありがとう、私はコードを更新します。 –