單刷APUE系列 第六章 系統資料檔案和資訊

2021-09-11 12:36:06 字數 2813 閱讀 5290

使用過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子類表示 傳遞...