getlogin()c函数返回NULL并错误“没有这样的文件或目录”

我有一个关于getlogin()函数()的问题。 我试图使用此函数从c程序中获取我的帐户的登录名。 但该函数返回NULL。 使用perror显示错误是“没有这样的文件或目录”。

我没有得到什么问题。 有没有办法在程序中获取用户登录名。

这是一个示例代码:

#include  #include  int main() { char *name; name = getlogin(); perror("getlogin() error"); //printf("This is the login info: %s\n", name); return 0; } 

这是输出: getlogin() error: No such file or directory

请让我知道如何做到这一点。

谢谢。

getlogin是一种不安全且已弃用的确定登录用户的方法。 它可能试图打开登录用户的记录,可能是utmp或者其他东西。 确定您正在运行的用户的正确方法(可能与登录用户不同,但无论如何总是更好),是getpwuid(getuid())

这是一个很好的链接,我发现它可能不起作用: getlogin

以下是它的引用:

不幸的是,愚弄getlogin()通常很容易。 有时它根本不起作用,因为某些程序弄乱了utmp文件

如果我评论perror电话,它对我来说很好。

来自man

getlogin()返回一个指向字符串的指针,该字符串包含在进程的控制终端上登录的用户的名称,如果无法确定此信息,则返回空指针。

所以你应该这样做:

 #include  #include  int main() { char *name; name = getlogin(); if (!name) perror("getlogin() error"); else printf("This is the login info: %s\n", name); return 0; } 

根据手册页错误(ENOENT)表示:

utmp文件中没有相应的条目。

我通常使用getpwent()以及对geteuid()和getegid()的调用。 这给了我可能需要知道的所有信息(至少就/ etc / passwd提供的信息)并告诉我我是否以setuid / setgid运行,这在防御性编程时很有用。

我已经为我的公司编写了几个程序,如果有人试图将它们设置为root并将所有权更改为root,或者如果被系统用户(www-data,nobody等)调用,则拒绝以root身份运行。

正如其他人所说,从utmp读取这个目的是一个非常糟糕的主意。