Linux中在代码中获取用户名和当前登录的用户名

网上获取用户名字的方法很多,但是有些一使用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;
}

运行结果如下:
在这里插入图片描述

强烈推荐后面这种方法

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值