GETGROUPS - Linux手册页

时间:2019-08-20 17:58:49  来源:igfitidea点击:

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/