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*/;

相关文章

首先GDB是类unix系统下一个优秀的调试工具, 当然作为debug代...
1. C语言定义1个数组的时候, 必须同时指定它的长度.例如:int...
C++的auto关键字在C+⬑新标准出来之前基本...
const关键字是用于定义一个不该被改变的对象,它的作用是告诉...
文章浏览阅读315次。之前用C语言编过链表,这几天突然想用C+...
文章浏览阅读219次。碰到问题就要记录下来,防止遗忘吧。文章...