GETGROUPLIST - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
getgrouplist-获取用户所属的组的列表
语法
#包括
int getgrouplist(const char * user,gid_t group,
gid_t * groups,int * ngroups);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
getgrouplist():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_BSD_SOURCE
说明
getgrouplist()函数扫描组数据库(请参阅group(5))以获得用户所属的组的列表。数组组中最多返回* ngroup个这些组。
如果它不在组数据库中为用户定义的组中,则该组将包含在由getgrouplist()返回的组列表中;通常,此参数从用户的密码记录中指定为组ID。
ngroups参数是一个值结果参数:返回时,它总是包含为用户找到的组数,包括组;此值可能大于存储在组中的组数。
返回值
如果用户是其成员的组的数目小于或等于* ngroups,则返回值* ngroups。
如果用户是多个* ngroups组的成员,则getgrouplist()返回-1。在这种情况下,* ngroups中返回的值可用于调整传递给进一步调用getgrouplist()的缓冲区的大小。
版本
自glibc 2.2.4起提供此功能。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
getgrouplist() | Thread safety | MT-Safe locale |
遵循规范
此功能是非标准的;它出现在大多数BSD上。
BUGS
在2.3.3之前的glibc版本中,此函数的实现包含一个缓冲区溢出错误:即使组数超过* ngroups,它也会为阵列组中的用户返回组的完整列表。
示例
下面的程序显示在第一个命令行参数中命名的用户的组列表。第二个命令行参数指定要提供给getgrouplist()的ngroups值。以下shell会话显示了此程序的使用示例:
$ ./a.out cecilia 0 getgrouplist() returned -1; ngroups = 3 $ ./a.out cecilia 3 ngroups = 3 16 (dialout) 33 (video) 100 (users)
Program source
#include <stdio.h> #include <stdlib.h> #include <grp.h> #include <pwd.h> int main(int argc, char *argv[]) { int j, ngroups; gid_t *groups; struct passwd *pw; struct group *gr; if (argc != 3) { fprintf(stderr, "Usage: %s <user> <ngroups>\n", argv[0]); exit(EXIT_FAILURE); } ngroups = atoi(argv[2]); groups = malloc(ngroups * sizeof (gid_t)); if (groups == NULL) { perror("malloc"); exit(EXIT_FAILURE); } /* Fetch passwd structure (contains first group ID for user) */ pw = getpwnam(argv[1]); if (pw == NULL) { perror("getpwnam"); exit(EXIT_SUCCESS); } /* Retrieve group list */ if (getgrouplist(argv[1], pw->pw_gid, groups, &ngroups) == -1) { fprintf(stderr, "getgrouplist() returned -1; ngroups = %d\n", ngroups); exit(EXIT_FAILURE); } /* Display list of retrieved groups, along with group names */ fprintf(stderr, "ngroups = %d\n", ngroups); for (j = 0; j < ngroups; j++) { printf("%d", groups[j]); gr = getgrgid(groups[j]); if (gr != NULL) printf(" (%s)", gr->gr_name); printf("\n"); } exit(EXIT_SUCCESS); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。