UNIX環境高階程式設計(7) 檔案和目錄(1)

2021-07-04 20:26:09 字數 2917 閱讀 6046

stat、fstat、lstat函式:

本章討論的中心是三個stat函式以及它們返回的資訊:

#include

int stat(const char *restrict pathname,struct stat *restrict buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *restrict pathname, struct stat *restrict buf);

三個函式的返回值:若成功返回0,若出錯則返回-1.

stat函式返回pathname所指定檔案的有關的資訊結構,fstat函式獲取已在描述符filedes上開啟檔案的有關資訊,lstat函式類似於stat,但是當命名的檔案是乙個符號鏈結時,lstat返回該符號鏈結的有關資訊,而不是由符號鏈結所指向檔案的資訊。

第二個引數buf是個指向struct stat結構體的指標,struct stat的實際定義可能隨實現有所不同,但其基本形式是:

struct stat ;

該結構的每乙個成員都是基本系統資料型別,我們將說明此結構的每乙個成員以了解檔案的屬性。使用stat函式最多的可能是ls -l命令,用其可以獲得有關乙個檔案的所有資訊。

檔案型別:

unix系統的大多數檔案是普通檔案或目錄,但也有另外的一些檔案型別,檔案型別包括以下幾種:

(1)普通檔案:這是最常用的檔案型別,這種檔案包含了某種形式的資料,這種資料是文字還是二進位制資料對於unix核心而言並無區別。值得注意是,對於二進位制可執行檔案,為了執行程式,核心必須理解其格式,所有二進位制可執行檔案都遵循一種格式,這種格式使核心能夠確定程式文字和資料載入的位置。

(2)目錄檔案:這種檔案包含了其他檔案的名字以及指向與這些檔案有關資訊的指標。

(3)塊特殊檔案:這種檔案型別提供對裝置(例如磁碟)帶緩衝的訪問,每次訪問以固定長度為單位進行。

(4)字元特殊檔案:這種檔案型別提供對裝置不帶緩衝的訪問,每次訪問長度可變。系統中的所有裝置要麼是字元特殊檔案,要麼是塊特殊檔案。

(5)fifo:這種檔案型別用於程序間通訊,有時也將其稱為命名管道。

(6)套接字(socket):這種檔案型別用於程序間的網路通訊。套接字也可用於在一台宿主機上程序之間的非網路通訊。

檔案型別資訊包含在stat結構體的st_mode成員中,可用下列巨集確定檔案型別,這些巨集的引數都是stat結構中的st_mode成員:

posix.1允許實現將程序間通訊(ipc)物件(例如,訊息佇列和訊號量)表示為檔案。可用如下巨集來確定ipc物件的型別,這些巨集的引數是指向stat結構的指標:

下列程式接收命令列引數,並針對每乙個命令列引數列印其所對應檔案的檔案型別:

/*

*/#include #include #include int

main(int argc, char *argv)

if (s_isreg(buf.st_mode)) else if (s_isdir(buf.st_mode)) else if (s_isblk(buf.st_mode)) else if (s_ischr(buf.st_mode)) else if (s_isfifo(buf.st_mode)) else if (s_issock(buf.st_mode)) else if (s_islnk(buf.st_mode)) else

printf ("%s\n", pt);

} exit(0);

}

以下是該程式的執行結果:

該程式特地使用了lstat函式而不是stat函式以便檢測符號鏈結,如果使用了stat函式,則不會觀察到符號鏈結。

設定使用者id和設定組id:

通常,有效使用者id等於實際使用者id,有效組id等於實際組id。

每個檔案都有乙個所有者和組所有者,所有者由stat結構中的st_uid成員表示,組所有者由st_gid成員表示。

當執行乙個程式檔案時,程序的有效使用者id通常就是實際使用者id,有效組id通常是實際組id。

但是可以在檔案模式字st_mode中設定乙個特殊標誌,其含義是「當執行此檔案時,將程序的有效使用者id設定為檔案所有者的使用者id(st_uid)」。與此類似,在檔案模式字中可以設定另一位,它使得將執行此檔案的程序的有效組id設定為檔案的組所有者id(st_gid)。

在檔案模式字中的這兩位被稱為設定使用者id位(set-user-id)和設定組id位(set-group-id)。設定使用者id位及設定組id位都儲存在st_mode值中,這兩位可用常量s_isuid和s_isgid測試。

unix程式passwd就是乙個設定了設定使用者id的可執行程式。

檔案訪問許可權:

st_mode值中也包含了針對檔案的訪問許可權位。所有檔案都有訪問許可權。每個檔案有9個訪問許可權位,chmod命令可用於修改這9個許可權位。

關於檔案的許可權,有如下注意事項:

程序每次開啟、建立、刪除檔案時,核心就進行檔案訪問許可權測試,這種測試可能涉及檔案的所有者(st_uid和st_gid),程序的有效id(有效使用者id,有效組id)以及程序的附加組id(如果支援的話)。

兩個所有者id是檔案的性質,而兩個有效id和和附加組id則是程序的性質。

檔案訪問許可權測試的過程為(按順序執行這四步):

新檔案或目錄的所有權:

新檔案的使用者id設定為程序的有效使用者id,關於組id,posix.1允許實現選擇下列之一作為新檔案的組id:

對於linux系統,新檔案的組id取決於它所在目錄的設定組id位是否被設定,如果該目錄的這一位已經設定,則將新檔案的組id設定為目錄的組id,否則將新檔案的組id設定為程序的有效組id。

unix環境高階程式設計 4 18 檔案時間

在unix系統中,每個檔案要保持三個時間字段,他們的意義分別如下 字段說明 例子ls選項 st atime st mtime st time 檔案資料的最後訪問時間 檔案按資料的最後修改時間 i節點狀體的最後更改時間 read write chmo,chown u預設 c注意st mtime 指的是...

unix環境高階程式設計 4 3 檔案型別

我們都知道在unix系統中,檔案分為兩種 普通檔案和目錄。unix大多數都是這些檔案型別。但是也有另外一種。下面簡單介紹一下檔案型別 1 普通檔案。最常見的檔案型別。2 目錄檔案。這種檔案包含了其他檔案的名字以及指向與這些檔案有關的資訊指標。對乙個目錄檔案具有讀許可權的任一程序都可以讀該目錄的內容,...

Unix環境高階程式設計 一 檔案I O

unix系統中大多數檔案i o只需用到五個函式 open read write lseek close。本章說介紹的i o是不帶緩衝的,即 每個read和write都呼叫核心中的乙個系統呼叫。不是iso c的組成部分。對於核心而言,所有開啟的檔案都通過檔案描述符引用。在中定義三個標準的檔案描述符 s...