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