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/archive/2011/10/10/2805994.html
總結
                            
                        - 上一篇: js中关于array的slice和sor
 - 下一篇: Source code for Baye