• 系统数据文件和信息之附加组ID


    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/

  • 相关阅读:
    Linux下的”锁“事儿
    拿得起,放得下,想得开
    关于TCP协议握手的那些事儿

    C++中的RTTI机制解析
    C/C++中产生随机数
    数据库-事务和锁
    JS 数组Array常用方法
    C# 压缩 SharpZipLib
    正则表达式学习3-负向零宽断言
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3507451.html
Copyright © 2020-2023  润新知