GETPWENT_R - Linux手册页

时间:2019-08-20 18:00:31  来源:igfitidea点击:

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)。

InterfaceAttributeValue
getpwent_r()Thread safetyMT-Unsafe race:pwent locale
fgetpwent_r()Thread safetyMT-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);
}

另外参见

fgetpwent(3),getpw(3),getpwent(3),getpwnam(3),getpwuid(3),putpwent(3),passwd(5)

出版信息

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