GETGROUPS - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-03-06
名称
getgroups,setgroups-获取/设置补充组ID的列表
语法
#包括
#包括
int getgroups(int size,gid_t list []);
#包括
int setgroups(size_t大小,const gid_t *列表);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
setgroups():
从glibc 2.19开始:
_DEFAULT_SOURCE
Glibc 2.19及更早版本:
_BSD_SOURCE
说明
getgroups()返回列表中调用进程的补充组ID。参数大小应设置为list指向的缓冲区中可以存储的最大项目数。如果呼叫过程是多个补充组的成员,则将导致错误。
未指定调用过程的有效组ID是否包含在返回列表中。 (因此,应用程序还应该调用getegid(2)并添加或删除结果值。)
如果size为零,则列表不会被修改,但是会返回该进程的补充组ID的总数。这允许调用者确定在进一步调用getgroups()中使用的动态分配列表的大小。
setgroups()设置调用过程的补充组ID。需要适当的特权(请参阅下面的EPERM错误说明)。 size参数指定列表指向的缓冲区中补充组ID的数量。一个进程可以通过调用删除其所有补充组:
setgroups(0, NULL);
返回值
成功时,getgroups()返回补充组ID的数量。如果出错,则返回-1,并正确设置errno。
成功时,setgroups()返回0。错误时,返回-1,并正确设置errno。
错误说明
- EFAULT
- 列表的地址无效。
getgroups()可能还会因以下错误而失败:
- EINVAL
- size小于补充组ID的数量,但不为零。
setgroups()可能还会因以下错误而失败:
- EINVAL
- 大小大于NGROUPS_MAX(Linux 2.6.4之前为32; Linux 2.6.4之后为65536)。
- ENOMEM
- 内存不足。
- EPERM
- 调用进程的特权不足(调用者所在的用户名称空间中没有CAP_SETGID功能)。
- EPERM(since Linux 3.19)
- 在此用户名称空间中拒绝使用setgroups()。请参阅user_namespaces(7)中对/ proc / [pid] / setgroups的描述。
遵循规范
getgroups():SVr4、4.3BSD,POSIX.1-2001,POSIX.1-2008。
setgroups():SVr4,4.3BSD。由于setgroups()需要特权,因此POSIX.1不涉及它。
备注
除有效组ID之外,一个进程最多可以具有NGROUPS_MAX个补充组ID。常量NGROUPS_MAX在中定义。补充组ID集是从父进程继承的,并在execve(2)中保留。
可以在运行时使用sysconf(3)找到最大数量的补充组ID:
long ngroups_max; ngroups_max = sysconf(_SC_NGROUPS_MAX);
getgroups()的最大返回值不能大于此值一。从Linux 2.6.4开始,最大补充组ID的数量也通过特定于Linux的只读文件/ proc / sys / kernel / ngroups_max公开。
原始的Linux getgroups()系统调用仅支持16位组ID。随后,Linux 2.4添加了支持32位ID的getgroups32()。 glibc getgroups()包装函数透明地处理了内核版本之间的差异。
C library/kernel differences
在内核级别,用户ID和组ID是每个线程的属性。但是,POSIX要求进程中的所有线程共享相同的凭据。 NPTL线程实现通过为更改过程UID和GID的各种系统调用提供包装函数来处理POSIX要求。这些包装函数(包括用于setgroups()的包装函数)采用基于信号的技术,以确保当一个线程更改凭据时,进程中的所有其他线程也更改其凭据。有关详细信息,请参见nptl(7)。
另外参见
getgid(2),setgid(2),getgrouplist(3),group_member(3),initgroups(3),功能(7),凭据(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。