getgrent_r函数用法详解
getgrent_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 );
getgrent_r函数常见使用错误
- 编译错误
warning: implicit declaration of function ‘getgrent_r’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <grp.h>
getgrent_r函数详细描述
函数getgrent_r ()和fgetgrent_r ()是getgrent (3)和fgetgrent (3)的可重入版本,前者从由setgrent (3)初始化的流中读取下一个组条目,后者从stream 中读取下一个组条目
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)
不可重入函数返回一个指向静态存储的指针,其中这个静态存储包含指向组名、密码和成员的更多指针。这里描述的可重入函数在调用者提供的缓冲区中返回所有这些。首先是可以容纳struct group的缓冲区gbuf。接下来是大小为buflen的缓冲区buf,它可以容纳额外的字符串。这些函数的结果,即从流中读取的PPPP5,被存储在所提供的缓冲器gbuf 中,并且指向该PPPP5的指针被返回到gbufp 中
getgrent_r函数返回值
如果成功,这些函数返回0,*gbufp是指向struct group的指针。出错时,这些函数返回一个错误值,*gbufp为空。
getgrent_r函数错误码
- ENOENT 没有更多条目。
- ERANGE 提供的缓冲区空间不足。请使用较大的缓冲区重试。
getgrent_r函数其他说明
函数getgrent_r ()不是真正可重入的,因为它与所有其他线程共享流中的读取位置。
getgrent_r函数使用举例
#define _GNU_SOURCE
#include <grp.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define BUFLEN 4096
int
main(void)
{
struct group grp;
struct group *grpp;
char buf[BUFLEN];
int i;
setgrent();
while (1) {
i = getgrent_r(&grp, buf, sizeof(buf), &grpp);
if (i)
break;
printf("%s (%jd):", grpp\->gr_name, (intmax_t) grpp\->gr_gid);
for (int j = 0; ; j++) {
if (grpp\->gr_mem[j] == NULL)
break;
printf(" %s", grpp\->gr_mem[j]);
}
printf("\en");
}
endgrent();
exit(EXIT_SUCCESS);
}
评论区