名称

getlogin,getlogin_r,cuserid-获取用户名

BUGS

不幸的是,愚弄getlogin()通常很容易。有时它根本不起作用,因为某些程序弄乱了utmp文件。通常,它仅给出登录名的前8个字符。当前在我们程序的控制终端上登录的用户不必是启动该程序的用户。避免出于安全相关目的使用getlogin()。

请注意,glibc不遵循POSIX规范,而是使用stdin代替/ dev / tty。一个错误。 (其他最新的系统,例如SunOS 5.8和HP-UX 11.11和FreeBSD 4.8都在重定向标准输入时也返回登录名。)

没有人确切地知道cuserid()的作用。避免在可移植程序中使用它。或完全避免使用它:如果那是您的意思,请使用getpwuid(geteuid())代替。不要使用cuserid()。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
getlogin()Thread safetyMT-Unsafe race:getlogin race:utent
sig:ALRM timer locale
getlogin_r()Thread safetyMT-Unsafe race:utent sig:ALRM timer
locale
cuserid()Thread safetyMT-Unsafe race:cuserid/!string locale

在上表中,race:utent中的utent表示如果在程序的不同线程中并行使用setutent(3),getutent(3)或endutent(3)中的任何功能,则可能发生数据争用。 getlogin()和getlogin_r()调用这些函数,因此我们使用race:utent来提醒用户。

另外参见

日志名(1),geteuid(2),getuid(2),utmp(5)

GETLOGIN - Linux手册页

Linux程序员手册 第3部分
更新日期: 2019-03-06

文件

/etc/passwd
密码数据库文件
/var/run/utmp
(传统上是/ etc / utmp;某些libc版本使用/ var / adm / utmp)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

错误说明

POSIX指定:

EMFILE
已达到打开文件描述符数量的每个进程限制。
ENFILE
已达到系统范围内打开文件总数的限制。
ENXIO
呼叫过程没有控制终端。
ERANGE
(getlogin_r)用户名的长度(包括终止的空字节(aq \ 0aq))大于bufsize。

Linux / glibc还具有:

ENOENT
utmp文件中没有相应的条目。
ENOMEM
内存不足,无法分配passwd结构。
ENOTTY
标准输入不涉及终端。 (请参阅错误。)

语法

#包括

char * getlogin(void);
int getlogin_r(char * buf,size_t bufsize);

#包括

char * cuserid(char * string);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

getlogin_r():_POSIX_C_SOURCE> = 199506L

cuserid():

Since glibc 2.24:
        (_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
        || _GNU_SOURCE
    Up to and including glibc 2.23:
        _XOPEN_SOURCE

遵循规范

getlogin()和getlogin_r():POSIX.1-2001,POSIX.1-2008。

系统V具有cuserid()函数,该函数使用实际用户ID而不是有效用户ID。 cuserid()函数包含在1988年的POSIX版本中,但从1990年的版本中删除了。它存在于SUSv2中,但已在POSIX.1-2001中删除。

即使没有控制终端,OpenBSD也具有getlogin()和setlogin()以及与会话关联的用户名。

说明

getlogin()返回指向包含在进程的控制终端上登录的用户名的字符串的指针,如果无法确定此信息,则返回空指针。该字符串是静态分配的,并且在对该函数或cuserid()的后续调用中可能会被覆盖。

getlogin_r()在大小为bufsize的数组buf中返回相同的用户名。

cuserid()返回一个指向包含与该进程的有效用户ID相关联的用户名的字符串的指针。如果string不是空指针,则它应该是一个至少可以容纳L_cuserid字符的数组;字符串在此数组中返回。否则,返回指向静态区域中的字符串的指针。该字符串是静态分配的,并且在随后对该函数或getlogin()的调用中可能会被覆盖。

宏L_cuserid是一个整数常量,指示您可能需要将数组存储用户名的时间。 L_cuserid在中声明。

这些功能使您的程序可以正确识别正在运行的用户(cuserid())或登录此会话的用户(getlogin())。 (当涉及到设置用户标识程序时,这些可能会有所不同。)

对于大多数目的,使用环境变量LOGNAME找出用户是更有用的。正是因为用户可以任意设置LOGNAME,这才更加灵活。

返回值

getlogin()成功时返回指向用户名的指针,失败时返回NULL,并设置errno以指示错误原因。 getlogin_r()成功时返回0,失败时返回非零。

日期:2019-08-20 18:00:06 来源:oir作者:oir