プログラムで環境(getenv、...)を使用せずに実際の「ユーザー名」を取得するにはどうすればよいですか?LinuxのC/C++でユーザー名を取得する方法は?
答えて
getlogin_r()
がunistd.h
で定義された関数あなたに返すsername。詳細については、man getlogin_r
を参照してください。
そのシグネチャは次のとおりです。言うこと
int getlogin_r(char *buf, size_t bufsize);
言うまでもなく、この機能は同じように簡単にCまたはC++で呼び出すことができます。
@ Armed9Gaggerでは、POSIXで定義されているこれらのことについて、C++ライブラリにAPIはありません。C++はPOSIX関数を使うことになっています*。 – spatz
注getlogin_rは、プロセスの制御端末にログインしているユーザーの名前を返します。これは、ジョブが実行されているユーザーとは異なる場合があります。この機能は、制御端末に接続していない場合(プロセスがデーモン化されている場合など)にも失敗します。 –
getlogin()これは簡単です – rohitsakala
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 "";
}
すべてのC関数ではなく、C *標準ライブラリ*を使うことはできない可能性があります。タスクを実行するには、C関数を直接的または間接的に使用する必要があります。 – Kos
あなたのプログラムがendpwent()呼び出しをしていないのではないかと思いますか? –
正解、ありがとう、私はコードを更新します。 –
cとC++の違いは何ですか?あなたはクラスメソッドを意味しますか? – AlexTheo
私はちょうどcの関数を使わないでください – Zat42
POSIXのAPIはすべてCの関数として定義されていますが、これはC++でも同じように呼び出すことができます。私はあなたの制限を理解していません。 – spatz