GETPWENT_R - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
getpwent_r,fgetpwent_r-可重入获取passwd文件条目
语法
#include <pwd.h> int getpwent_r(struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp); int fgetpwent_r(FILE *stream, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
getpwent_r(),
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_BSD_SOURCE _SVID_SOURCE
fgetpwent_r():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_SVID_SOURCE
说明
函数getpwent_r()和fgetpwent_r()是getpwent(3)和fgetpwent(3)的可重入版本。前者从由setpwent(3)初始化的流中读取下一个passwd条目。后者从流中读取下一个passwd条目。
passwd结构的定义如下:
struct passwd { char *pw_name; /* username */ char *pw_passwd; /* user password */ uid_t pw_uid; /* user ID */ gid_t pw_gid; /* group ID */ char *pw_gecos; /* user information */ char *pw_dir; /* home directory */ char *pw_shell; /* shell program */ };
有关此结构的字段的更多信息,请参见passwd(5)。
非可重入函数返回指向静态存储的指针,该静态存储中还包含指向用户名,密码,gecos字段,主目录和shell的指针。此处描述的可重入函数在调用者提供的缓冲区中返回所有这些。首先,缓冲区pwbuf可以容纳一个结构passwd。接下来,缓冲区buflen的大小为buflen,可以容纳其他字符串。这些函数的结果(从流中读取的struct passwd)存储在提供的缓冲区* pwbuf中,并且指向该struct passwd的指针在* pwbufp中返回。
返回值
成功时,这些函数将返回0,并且* pwbufp是指向结构passwd的指针。发生错误时,这些函数将返回错误值,并且* pwbufp为NULL。
错误说明
- ENOENT
- 没有更多条目。
- ERANGE
- 提供的缓冲区空间不足。使用更大的缓冲区再试一次。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
getpwent_r() | Thread safety | MT-Unsafe race:pwent locale |
fgetpwent_r() | Thread safety | MT-Safe |
在上表中,race中的pwent:pwent表示如果在程序的不同线程中并行使用setpwent(),getpwent(),endpwent()或getpwent_r()中的任何函数,则可能发生数据争用。
遵循规范
这些函数是GNU扩展,以类似于POSIX版本的函数(如getpwnam_r(3))的样式完成。其他系统使用原型
struct passwd * getpwent_r(struct passwd *pwd, char *buf, int buflen);
或更好,
int getpwent_r(struct passwd *pwd, char *buf, int buflen, FILE **pw_fp);
备注
函数getpwent_r()并不是真正可重入的,因为它与所有其他线程共享流中的读取位置。
示例
#define _GNU_SOURCE #include <pwd.h> #include <stdio.h> #define BUFLEN 4096 int main(void) { struct passwd pw, *pwp; char buf[BUFLEN]; int i; setpwent(); while (1) { i = getpwent_r(&pw, buf, BUFLEN, &pwp); if (i) break; printf("%s (%d)\tHOME %s\tSHELL %s\n", pwp->pw_name, pwp->pw_uid, pwp->pw_dir, pwp->pw_shell); } endpwent(); exit(EXIT_SUCCESS); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。