gpt4 book ai didi

C/Linux : How to get users login name without `getlogin`

转载 作者:IT王子 更新时间:2023-10-29 00:42:00 25 4
gpt4 key购买 nike

我需要在 C 程序中检索用户的用户名。我知道 getlogingetlogin_r。但是我的程序有一个重定向的标准输入(因为一些fork)。

我遇到的问题在联机帮助页中有说明:

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(真实的、有效的或已保存的集)(如果您想模拟 getlogin,您可能需要 RUID,在这种情况下,您可以只需调用 getuid 并忘记有效和保存集 uid),然后使用 getpwuid(3)或其可重入对应物将其转换为用户 ID 字符串。

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

从技术上讲,当 stdin 是您的控制终端时,所有这些可能与 getlogin 获得的结果不同。如果你真的需要与 getlogin 相同的答案,你可以暂时让你的 fd 0 再次指向你的控制终端,然后调用 getlogin,然后恢复你的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*/;

关于C/Linux : How to get users login name without `getlogin` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com