GETGRENT_R - Linux手册页
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)。
| Interface | Attribute | Value |
| getgrent_r() | Thread safety | MT-Unsafe race:grent locale |
| fgetgrent_r() | Thread safety | MT-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);
}
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。

