我需要在C程序中检索用户的用户名。我知道getlogingetlogin_r。但是我的程序有一个重定向的stdin(由于一些forks)。

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



还有什么其他方法可以检索用户名?

最佳答案

使用getresuid(2)或某些更特定的id检索功能来获取所需的id(真实,有效或保存集)(如果要模拟getlogin,则可能需要RUID),在这种情况下,您可以简单地调用getuid并忘记有关有效和已保存设置的uid),然后使用getpwuid(3)或它的可重入对应版本将其转换为用户ID字符串。
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*/;

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

10-15 07:57