C / Linux:如何在没有`getlogin`的情况下获取用户登录名

前端之家收集整理的这篇文章主要介绍了C / Linux:如何在没有`getlogin`的情况下获取用户登录名前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在C程序中检索用户用户名.我知道getlogin和getlogin_r.但我的程序有一个重定向的标准输入(因为一些分叉).

我面临的问题在联机帮助页中说明:

Note that glibc does not follow the POSIX specification and uses stdin
instead of /dev/tty. A bug. (Other recent systems,like SunOS 5.8
and HP-UX 11.11 and FreeBSD 4.8 all return the login name also when
stdin is redirected).

有没有其他方法可以检索用户名

解决方法

使用 getresuid(2)或一些更具体的id检索函数获取你想要的id(真实,有效或保存集)(你可能想要RUID,如果你想模仿getlogin,在这种情况下你可以简单地调用getuid并忘记关于有效和已保存集合的uid),然后使用 getpwuid(3)或其可重入对应方将其转换为用户标识字符串.

getenv(“USER”)可能会给你相同的结果,但如果你想要真正的安全性,就不能依赖它.

从技术上讲,当stdin是您的控制终端时,所有这些可能与getlogin获得的结果不同.如果你真的需要和getlogin一样的答案,你可以暂时让你的fd 0指向你的控制终端,然后调用getlogin,然后恢复你的fd 0:

int saved_fd0;
if(0>(saved_fd0 = dup(0))
       /*handle error*/;
close(0);

/*open always gets the lowest possible fd number == now 0*/
/*"/dev/tty" is always your current processes's controlling terminal*/
if(0>open("/dev/tty",O_RDONLY))
    /*handle error*/;
/*
getlogin()
..
*/
/*restore saved_fd0*/
if(0>dup2(saved_fd0,0))
       /*handle error*/;
原文链接:https://www.f2er.com/c/117418.html

猜你在找的C&C++相关文章