使用過unix系統的朋友應該知道/etc/passwd
檔案,這就是unix系統口令檔案,在posix1.x規範中規定unix系統必須存在使用者資料庫,這些使用者資料庫裡每個使用者都需要包含一些字段,具體需要檢視標頭檔案。
struct passwd ;複製**
在很多unix系統中,passwd
是乙個ascii檔案,每一行是乙個使用者,然後每個使用者都包含這些字段,字段之間使用冒號分隔,但是在蘋果系統中,則是使用opendirectory
守護程序來儲存使用者資料庫等資料。
系統提供了兩個獲取口令檔案項的函式
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *login);複製**
這兩個函式都會返回passwd結構體,而且需要注意的是,這個結構體指標實際上是指向一塊靜態區域的指標,也就是說,不同通過保留指標來讓後面使用。
struct passwd *getpwent(void);
void setpwent(void);
void endpwent(void);複製**
getpwent函式則是一項一項讀取,然後將其以passwd結構體返回,非常適合需要讀取全部內容的情況。setpwent和endpwent清理讀取的快取,其中endpwent則是關閉所有的檔案,當使用getpwent後一定要使用endpwent關閉檔案。
在最初的unix系統實現中,密碼是存放在/etc/passwd
檔案的第二個欄位中,但是由於有很多程式讀取這個檔案,所以這個欄位被專門移出來放在/etc/shadow
中,通常情況下,只有root許可權才能讀取。在solaris和linux中,有一組函式用於訪問陰影口令檔案,但是,非常遺憾的是,蘋果系統中沒有,所以這裡也就只能講一講,而不能列出實際的**。
struct group ;複製**
上面是蘋果系統定義的group
結構體
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);複製**
就如同口令檔案的函式一樣,上面的函式用法也是一樣的。
在早期unix系統實現中,是不存在附屬組的。直到後來bsd的乙個版本引入了附屬組id的概念,這樣在許可權檢查的時候也需要檢查附屬組id的許可權
int getgroups(int gidsetsize, gid_t grouplist);
int setgroups(int ngroups, const gid_t *gidset);
int initgroups(const char *name, int basegid);複製**
getgroups
函式將程序所屬使用者的附屬組id放入grouplist引數中,groupsize引數用於確定放入的大小,但是實際上,我們可以將groupsize設定為0,然後函式會返回實際的附屬組個數,然後就可以很方便的分配grouplist陣列,用不著去猜測究竟應該分配多少。
setgroups
是乙個root許可權操作,用於為程序設定附屬組id。
initgroups
是一系列操作的集合,實際上用到的機會極少,如果有需要的朋友可以自行**系統手冊。
除了上面講到的兩個檔案以外,系統還有很多其他的檔案,但是基本上都是提供了同樣的介面(get,set,end),而且和前面的用法基本一樣,所以這裡也不再講解。
在實際的運維中,經常會需要檢視使用者的登入日誌,所以系統也有相關的資料檔案和介面函式用於開發使用。
原著中講解了utemp結構體的內容,這裡不再多講,但是在蘋果系統中,實際上已經被utempx等結構體所取代
struct utmpx ;
struct lastlogx ;複製**
其實,不光是蘋果系統,其他的unix系統的字段也已經被修改擴充了,而且其實這個並不重要,所以只需要了解即可。
posix定義了uname函式,用於返回主機和作業系統相關的資訊,uname命令就是使用了這個函式。
int uname(struct utsname *name);
struct utsname ;複製**
所有的成員都是以null位元組結尾,並且bsd派生系統也提供了gethostname函式
int gethostname(char *name, size_t namelen);複製**
實際上還有乙個sethostname函式,但是這裡也不多講,除此以外,上面的一些函式實際上有一些已經被移到標準c庫中了,所以也能作為跨平台開發使用。
unix系統都使用的是unix時間戳,也就是utc時間2023年1月1日0時0分0秒以來的秒數,在前面我們提到過它,這個就是日曆時間,並且是使用time_t
型別儲存的。
time_t time(time_t *tloc);複製**
time函式就是很簡單的獲取日曆時間,在一般的情況下,都是傳入null然後獲得函式返回值來使用。
原著中也講到了指定時間的獲取,但是非常不幸,蘋果系統又沒有這些方法,所以這裡也只能不提及了。
單刷APUE系列 第六章 系統資料檔案和資訊
單刷apue系列 第一章 unix基礎知識 1 單刷apue系列 第一章 unix基礎知識 2 單刷apue系列 第二章 unix標準及實現 單刷apue系列 第三章 檔案i o 單刷apue系列 第四章 檔案和目錄 1 單刷apue系列 第四章 檔案和目錄 2 單刷apue系列 第五章 標準i o...
APUE 第六章 系統資料檔案和資訊
口令檔案 struct passwd struct passwd getpwuid uid t uid 通過使用者id獲得相應的passwd結構 struct passwd getpwnam const char name 通過使用者名稱獲得相應的passwd結構 void setpwent 初始化...
第六章 事件系統
2019 9 12事件 乙個事件會有多個事件型別處理事件的方法 1 重新實現事件處理函式,只能用來處理特定部件的特定事件 2 重新實現notify函式,一次只能處理乙個事件 4 重新實現event函式 5 在物件上安裝事件過濾器事件傳遞 exec函式使應用程式進入事件迴圈 qevent子類表示 傳遞...