6.5 附加组ID

6.5 附加组ID

在Unix中,组的使用已经作了些更改。在Version7中,每个用户任何时候都只属于一个组。当用户登录时,系统就按口令字文件中与其相关记录中的数字组ID,赋给他实际组ID。我们可以在任何时候执行newgrp(1)以更改组ID。如果newgrp命令执行成功(关于许可权规则,请参阅手册页),则我们的实际组ID就更改为新的组ID,它将被用于后续的文件存取许可权检查。执行不带任何参数的newgrp,则可返回到原来的组。

这种组的成员关系一直维持到1983年左右。此时,4.2BSD引入了附加组ID(supplementary group ID)的概念。我们不仅属于我们的口令字记录中组ID所对应的组,也可属于多至16个另外的一些组。文件存取权检查相应修改为:不仅将进程的有效组ID与文件的组ID相比较,而且也将所有附加组ID与文件的组ID进行比较。

使用附加组ID的优点是我们不必再显式地经常更改组。一个用户常常会参加多个项目组,因此也就要同时属于多个组。

为了存取和设置附加组ID提供了下列三个函数:

#include <unistd.h>

int getgroups(int gidsetsize, gid_t grouplist[]);

#include <grp.h>

#include <unistd.h>

int setgroups(int ngroups, const gid_t grouplist[]);

int initgroups(const char *username, gid_t basegid);


getgroups将进程所属用户的各附加组ID填写到数组bgrouplist中,填写入该数组的附加组ID数最多为gidsetsize个。实际填写到数组中的附加组ID数由函数返回。

作为一种特殊情况,如若giclsetsize为0,则函数只返回附加组ID数,而对数组grouplist则不作修改。(这使调用者可以确定grouplist数组的长度,以便进行分配。)

setgroups可由超级用户调用以便为调用进程设置附加组ID表。grouplist,是组ID数组,而ngroups说明了数组中的元素数。

通常,只有initgroups函数调用setgroups,initgroups读整个组文件(用函数getgrent,setgrent和endgrent),然后对username确定其组的成员关系。然后,它调用setgroups,以便为该用户初始化附加组ID表。因为initgroups调用setgroups,所以只有超级用户才能调用initgroups。除了在组文件中找到username是成员的组,initgroups也在附加组ID表中包括了basegid。basegid是username在口令字文件中的组ID。initgroups只有少数几个程序调用,例如login(1)程序在用户登录时调用该函数。

原文地址:https://www.cnblogs.com/shaoguangleo/p/2805994.html