GETGRENT_R - Linux手册页

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

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

名称

getgrent_r,fgetgrent_r-重新获得组文件条目

语法

#include <grp.h>

int getgrent_r(struct group *gbuf, char *buf,
               size_t buflen, struct group **gbufp);

int fgetgrent_r(FILE *stream, struct group *gbuf, char *buf,
                size_t buflen, struct group **gbufp);

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

getgrent_r():_GNU_SOURCE
fgetgrent_r():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_SVID_SOURCE

说明

函数getgrent_r()和fgetgrent_r()是getgrent(3)和fgetgrent(3)的可重入版本。前者从由setgrent(3)初始化的流中读取下一个组条目。后者从流中读取下一个组条目。

组结构定义如下:

struct group {
    char   *gr_name;        /* group name */
    char   *gr_passwd;      /* group password */
    gid_t   gr_gid;         /* group ID */
    char  **gr_mem;         /* NULL-terminated array of pointers
                               to names of group members */
};

有关此结构的字段的更多信息,请参见group(5)。

非可重入函数返回指向静态存储的指针,该静态存储中包含指向组名,密码和成员的其他指针。此处描述的可重入函数在调用者提供的缓冲区中返回所有这些。首先,有一个缓冲区gbuf可以容纳一个结构组。接下来,缓冲区buflen的大小为buflen,可以容纳其他字符串。这些函数的结果(从流中读取的结构组)存储在提供的缓冲区* gbuf中,并在* gbufp中返回指向该结构组的指针。

返回值

成功时,这些函数将返回0,* gbufp是指向结构组的指针。发生错误时,这些函数将返回错误值,并且* gbufp为NULL。

错误说明

ENOENT
没有更多条目。
ERANGE
提供的缓冲区空间不足。使用更大的缓冲区再试一次。

属性

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

InterfaceAttributeValue
getgrent_r()Thread safetyMT-Unsafe race:grent locale
fgetgrent_r()Thread safetyMT-Safe

在上表中,race中的grent:grent表示如果在程序的不同线程中并行使用了setgrent(3),getgrent(3),endgrent(3)或getgrent_r()中的任何一个函数,则数据竞争可能发生。

遵循规范

这些函数是GNU扩展,以类似于POSIX版本的函数(如getpwnam_r(3))的样式完成。其他系统使用原型

struct group *getgrent_r(struct group *grp, char *buf,
                         int buflen);

或更好,

int getgrent_r(struct group *grp, char *buf, int buflen,
               FILE **gr_fp);

备注

函数getgrent_r()并不是真正可重入的,因为它与所有其他线程共享流中的读取位置。

示例

#define _GNU_SOURCE
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFLEN 4096

int
main(void)
{
    struct group grp, *grpp;
    char buf[BUFLEN];
    int i;

    setgrent();
    while (1) {
        i = getgrent_r(&grp, buf, BUFLEN, &grpp);
        if (i)
            break;
        printf("%s (%d):", grpp->gr_name, grpp->gr_gid);
        for (i = 0; ; i++) {
            if (grpp->gr_mem[i] == NULL)
                break;
            printf(" %s", grpp->gr_mem[i]);
        }
        printf("\n");
    }
    endgrent();
    exit(EXIT_SUCCESS);
}

另外参见

fgetgrent(3),getgrent(3),getgrgid(3),getgrnam(3),putgrent(3),group(5)

出版信息

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