GETLOGIN - Linux手册页
Linux程序员手册 第3部分
更新日期: 2019-03-06
名称
getlogin,getlogin_r,cuserid-获取用户名
语法
#包括
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()返回指向包含在进程的控制终端上登录的用户名的字符串的指针,如果无法确定此信息,则返回空指针。该字符串是静态分配的,并且在对该函数或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,失败时返回非零。
错误说明
POSIX指定:
- EMFILE
- 已达到打开文件描述符数量的每个进程限制。
- ENFILE
- 已达到系统范围内打开文件总数的限制。
- ENXIO
- 呼叫过程没有控制终端。
- ERANGE
- (getlogin_r)用户名的长度(包括终止的空字节(aq \ 0aq))大于bufsize。
Linux / glibc还具有:
- ENOENT
- utmp文件中没有相应的条目。
- ENOMEM
- 内存不足,无法分配passwd结构。
- ENOTTY
- 标准输入不涉及终端。 (请参阅错误。)
文件
- /etc/passwd
- 密码数据库文件
- /var/run/utmp
- (传统上是/ etc / utmp;某些libc版本使用/ var / adm / utmp)
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
getlogin() | Thread safety | MT-Unsafe race:getlogin race:utent sig:ALRM timer locale |
getlogin_r() | Thread safety | MT-Unsafe race:utent sig:ALRM timer locale |
cuserid() | Thread safety | MT-Unsafe race:cuserid/!string locale |
在上表中,race:utent中的utent表示如果在程序的不同线程中并行使用setutent(3),getutent(3)或endutent(3)中的任何功能,则可能发生数据争用。 getlogin()和getlogin_r()调用这些函数,因此我们使用race:utent来提醒用户。
遵循规范
getlogin()和getlogin_r():POSIX.1-2001,POSIX.1-2008。
系统V具有cuserid()函数,该函数使用实际用户ID而不是有效用户ID。 cuserid()函数包含在1988年的POSIX版本中,但从1990年的版本中删除了。它存在于SUSv2中,但已在POSIX.1-2001中删除。
即使没有控制终端,OpenBSD也具有getlogin()和setlogin()以及与会话关联的用户名。
BUGS
不幸的是,愚弄getlogin()通常很容易。有时它根本不起作用,因为某些程序弄乱了utmp文件。通常,它仅给出登录名的前8个字符。当前在我们程序的控制终端上登录的用户不必是启动该程序的用户。避免出于安全相关目的使用getlogin()。
请注意,glibc不遵循POSIX规范,而是使用stdin代替/ dev / tty。一个错误。 (其他最新的系统,例如SunOS 5.8和HP-UX 11.11和FreeBSD 4.8都在重定向标准输入时也返回登录名。)
没有人确切地知道cuserid()的作用。避免在可移植程序中使用它。或完全避免使用它:如果那是您的意思,请使用getpwuid(geteuid())代替。不要使用cuserid()。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。