我需要在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*/;