我正在开发一个C应用程序,其中我需要当前登录用户的名称。我尝试使用getlogin()
和getlogin_r()
但没有成功(在使用Ubuntu 16.04 LTS的多个系统上测试)。应用程序将以root身份运行,因此我无法使用环境变量。
getlogin()
和getlogin_r()
在其他Ubuntu 17.04 / 17.10 / 18.04(测试版)上工作正常,所以我不明白为什么它在16.04不起作用。
以下是我用来测试的代码段:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
int main(int argc, char *argv[])
{
char user[512] = {0};
int ret = getlogin_r(user, 512);
if ( ret != 0){
fprintf(stderr, "Unable to get User name. Return: %d\n", ret);
}
else{
fprintf(stdout, "Username: %s\n", user);
}
char *lgn;
struct passwd *pw;
if ((lgn = getlogin()) == NULL || (pw = getpwnam(lgn)) == NULL)
{
fprintf(stderr, "Get of user information failed.\n");
}
struct passwd *pwd = getpwuid(getuid());
if (pwd){
fprintf(stdout, "Success! Username: %s\n", pwd->pw_name);
}else
fprintf(stderr, "Failed");
return 0;
}
这是我以root身份执行代码时生成的输出:
Unable to get User name. Return : 2
Get of user information failed.
Success! Username: root
getpwuid
返回运行该流程的用户的详细信息,因此无效。
我现在有点困惑,非常感谢任何帮助。
使用strerror()
getlogin_r() : No such process
getlogin() : No such file or directory
Success! Username: root