我需要在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*/;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。