网上获取用户名字的方法很多,但是有些一使用sudo命令,获取到的用户名就是root的用户名了。
直接上代码
#include <stdio.h>
#include <pwd.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
struct passwd *pwd;
pwd = getpwuid(getuid());
char * user = getenv("USER");
char *name = getlogin(); //使用sudo的时候也显示当前登录的用户名
printf("%s\n", pwd->pw_name);
printf("%s\n", user);
printf("%s\n", name);
return 0;
}
//上述不用释放内存
我本机用户是名字是 “work2”
2021/7/9 补充一下,上面虽然能获取到但是存在问题。
char * user = getenv(“USER”); 是通过环境变量来获取的 当没有 “USER” 这个环境变量的时候会返回一个NULL值,这是一个很大的坑,前几天写一个dbus服务的时候我就使用了这个方法,手动启好使,但是dbus就是拉不起来我的进程,一直说段错误。 定位了半天最终发现dbus在拉起别的进程的时候 没有环境变量,所以这个函数返回了一个NULL ,然后又没判断就挂了。 好大的一个坑,害 以后用别的返回指针的接口一定要判空,一定要判空,一定要判空。
*"char name = getlogin();" 这个函数好使,但是也存在问题,那就是内存是外界给的,不安全,你不知道这个内存有多大 ,不好控制。可能就会被别人用于攻击你的程序。
做了快一年的开发了, 体会就是,什么事情指望别人都是可怕的,稳定点越多,程序就改的越少
获取当前登录用户名,并保证内存安全;
可以使用 getlogin_r()
成功返回 0
失败返回非 0
#include <stdio.h>
#include <unistd.h>
int main()
{
char name1[100] = {0};
char name2[1] = {0};
int ret1 = getlogin_r(name1, 100);
int ret2 = getlogin_r(name2, 1);
printf("ret1 = %d name = %s\n", ret1 , name1);
printf("ret2 = %d name = %s\n", ret2 , name2);
return 0;
}
运行结果如下:
强烈推荐后面这种方法