4.2BSD引入了附加组ID(supplementary group ID)的概念。我们不仅可以属于口令文件记录项中组ID所对应的组,也可属于多达16个另外的组。文件访问权限检查相应被修改为:不仅将进程的有效组ID与文件的组ID相比较,而且也将所有附加组ID与文件的组ID进行比较。

常量NGROUPS_MAX规定了附加组ID的数量,其常用值是16.

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

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

#include <unistd.h>

int getgroups( int gidsetsize, gid_t grouplist[] );
返回值:若成功则返回附加组ID数,若出错则返回-1 #include <grp.h> /* on Linux */
#include <unistd.h> /* on FreeBSD, Mac OS X, and Solaris */ int setgroups( int ngroups, const gid_t grouplist[] ); #include <grp.h> /* on Linux and Solaris */
#include <unistd.h> /* on FreeBSD and Mac OS X */ int initgroups( const char *username, gid_t basegid );
两个函数返回值:若成功则返回0,若出错则返回-1

getgroups将各附加组ID填写到数组grouplist中,该数组中存放的元素最多为gidsetsize个。实际填写到数组中的附加组ID数由函数返回。

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

setgroups可由超级用户调用以便为调用进程设置附加组ID表。grouplist是组ID数组,而ngroups指定了数组中的元素个数。ngroups的值不能大于NGROUPS_MAX。

通常,只有initgroups函数调用setgroups,initgroups读整个组文件(用前面说明的函数getgrent、setgrent和endgrent),然后对username确定其组的成员关系。然后,它调用setgroups,以便为该用户初始化附加组ID表。因为initgroups调用setgroups,所以只有超级用户才能调用initgroups。除了在组文件中找到username是成员的所有组,initgroups也在附加组ID表中包括了baseid。baseid是username在口令文件中的组ID。

只有少数几个程序调用initgroups,例如login(1)程序在用户登录时调用该函数。

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

系统数据文件和信息之附加组ID的更多相关文章

  1. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. [APUE]系统数据文件与信息

    一.口令文件 UNIX口令文件包含下表中的各个字段,这些字段包含在 由于历史原因,口令文件是/bin/passwd,而且是一个文本文件,每一行都包括了上表中的七个字段,字段之间用":&quo ...

  3. UNIX环境高级编程 第6章 系统数据文件和信息

    UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...

  4. apue学习笔记(第六章 系统数据文件和信息)

    UNIX系统的正常运作需要使用大量与系统有关的数据文件,例如,口令文件/etc/passwd和组文件/etc/group就是经常被多个程序频繁使用的两个文件. 口令文件 UNIX系统口令文件包含如下字 ...

  5. UNIX系统高级编程——第六章-系统数据文件和信息-总结

    口令文件: /* The passwd structure. */ struct passwd { char *pw_name; /* Username. */ char *pw_passwd; /* ...

  6. [06]APUE:系统数据文件和信息

    [a] getpwent / setpwent / endpwent #include <pwd.h> struct passwd *getpwent(void) //成功返回指针,出错或 ...

  7. APUE学习笔记——6 系统数据文件与信息

    1.用户口令:/etc/passwd文件 该文件中包含下列结构体信息.其中,当下主修熊passwd不再这里显示,是使用了一个占位符. struct passwd { char * pw_name; / ...

  8. 《UNIX环境高级编程》读书笔记之系统数据文件和信息(1)

    1.UNIX系统口令文件包括了下图所看到的的各字段,这些字段包括在<pwd.h>中定义的passwd结构体中 POSIX定义了两个获取口令文件项的函数. 在给出用户登录名或用户ID后.这两 ...

  9. apue 第6章 系统数据文件和信息

    在给出用户登录名或数值用户ID后,这两个函数就能查看相关项. #include <sys/types.h> #include <pwd.h> struct passwd *ge ...

随机推荐

  1. 六月计划#2A(6.10-6.16)

    17/35 STL BZOJ_1588_&_Codevs_1296_[HNOI2002]_营业额统计(平衡树/set)(set重做) BZOJ_1208_&_Codevs_1258_[ ...

  2. ☀【css】透明

    让IE浏览器支持RGBA颜色http://www.hujuntao.com/web/css/ie-browser-support-for-rgba-color.html 透明纯色背景 backgrou ...

  3. 从头开始编写一个Orchard网上商店模块(1) - 介绍

    原文地址:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-par ...

  4. Using the Task Parallel Library (TPL) for Events

    Using the Task Parallel Library (TPL) for Events The parallel tasks library was introduced with the ...

  5. 用Oracle的TRIM函数去除字符串首尾指定字符

    去掉首尾空格 SELECT TRIM(' abc '), ltrim(' abc '), rtrim(' abc ') FROM dual; 去掉首尾的其他字符 SELECT /*TRIM(';a;b ...

  6. c++ 11 key note

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. The Donkey of Gui Zhou

    Problem Description There was no donkey in the province of Gui Zhou, China. A trouble maker shipped ...

  8. 【原】Arrays.binarySearch() 的用法

    Arrays.binarySearch() 的用法 1.binarySearch(Object[] a, Object key) Searches the specified array for th ...

  9. 经典sql总结(1)

    1.表示info 信息,字段为Id和res,如何得到如下结果

  10. 判断是否已安装.net framework

    1.检测 %SystemRoot%\System 目录下的MSCorEE.dll文件,如果存在,则表明.net framework 已安装. 2.检测一下注册表项的子项: KEY_LOCAL_MACH ...