《unix環境高階程式設計》筆記2

2021-06-05 09:45:07 字數 4502 閱讀 1835

第四章 檔案和目錄

本章將描述檔案系統特徵和檔案性質

1、stat、fstat和lstat函式

原型:#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

注:lstat與stat的不同,當命名檔案是乙個符號鏈結時,lstat返回符號鏈結的有關資訊,而stat返回引用檔案的資訊。

struct stat;

stat函式使用ls -l

2、檔案型別:包括普通檔案、目錄檔案、塊特殊檔案、字元特殊檔案、fifo、套接字、符號鏈結。

檔案型別資訊包括在stat結構的st_mode欄位

,可用以下巨集檢測檔案型別:

s_isreg():普通檔案;s_isdir():目錄檔案;s_ischr():字元特殊檔案;s_isblk():塊特殊檔案;s_isfifo():管道或fifo;s_islnk():符號鏈結;s_issock():套接字。 注:標頭檔案:引數是st_mode

由於posix.1允許實現將程序間通訊物件(如訊息佇列和訊號量等)表示為檔案,所以有一些對應巨集用於測是:s_typeismq():訊息佇列;s_typeissem():訊號量;s_typeisshm():共享儲存物件。注:linux沒有把他們實現為檔案,所以沒啥用。

3、設定使用者id和組id

與程序相關的id:實際使用者id、實際組id(我們實際上是誰,這兩個值取自登陸時)、

有效使用者id、有效組id、附加組id(用於檔案訪問許可權檢查,決定了訪問許可權)、

儲存的設定使用者id、儲存的設定組id(由exec函式儲存),

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

每個檔案都有所有者(st_uid)和組所有者(st_gid)。

可以在st_mode中設定乙個特殊標誌,使「當執行這個檔案時,將程序的有效使用者id設定為所有者id」,這叫做設定使用者id,

同理有設定組id。例如:passwd程式就使用了設定使用者id。。。可用s_isuid和s_isgid巨集測試設定使用者id和設定組id。

4、檔案訪問許可權

9個訪問許可權位:

s_irusr:使用者讀;s_iwuer:使用者寫;s_ixusr:使用者執行;   

s_irgrp:組讀;s_iwgrp:組寫;s_ixgrp:組執行;     

s_iroth:其他讀   s_iwoth:其他寫   s_ixoth:其他執行。

5、新檔案和目錄的所有權:新檔案的使用者id設定為程序的有效使用者id,組id設定為:(1)程序的有效組id;(2)所在目錄的組id。

6、access函式:按實際使用者id和實際組id進行訪問許可權測試。用於驗證實際使用者能否訪問1個檔案。

原型:#includeint access(const char* pathname, int mode);   mode:r_ok(測試讀許可權),w_ok(測試寫許可權),x_ok(測試執行許可權),f_ok(測試檔案是否存在)   注:這些標誌可以進行或運算,來自標頭檔案

7、umask函式:為程序設定檔案模式建立遮蔽字,並返回以前的值,無出錯函式。

原型:#includemode_t umask(mode_t cmask) 返回以前的檔案模式建立遮蔽字,其中引數cmask是s_irusr等9個常量之一或按位或的結果。

說明:任何在檔案模式建立遮蔽字中為1的位,在檔案mode中的對應位一定被關閉。

8、chmod和fchmod函式:更改現有檔案的訪問許可權

原型:#include

int chmod(const char* pathname, mode_t mode);

int fchmod(int filedes, mode_t mode);        成功返回0,失敗返回-1

mode可以使用的引數:1、上文的9個檔案訪問常量   2、s_irwxu、s_irwxg、s_irwxo、s_isuid(設定使用者id)、s_isgid(設定組id)、s_isvtx(儲存正位(粘住位))

9、粘住位:如果對乙個目錄設定了粘住位,則要更名和或刪除該目錄下的檔案必須滿足以下條件之一:擁有此檔案;擁有此目錄;是超級使用者。   一般來說,/temp目錄就設定了粘住位。

10、chown、fchown和lchown函式:可用於更改檔案的使用者id或組id

原型:#include

int chown(const char* pathname, uid_t owner, gid_t group);

int fchown(int filedes, uid_t owner, gid_t group);

int lchown(const char* pathname, uid_t owner, gid_t group);         成功返回0,失敗返回-1    lchown:當是符號鏈結時,lchown改變符號鏈結本身的所有者,而不是該符號鏈結指向的檔案。

若owner或 group引數的值為-1,則對應的值不變。

11、檔案長度:stat結構成員st_size表示以位元組為單位的檔案長度。此字段只對普通檔案、目錄檔案和符號鏈結有意義。     stat的st_blksize欄位:檔案io較合適的塊長度  st_blocks:實際512位元組數量。

du   -s   core : 報告該檔案的st_blocks值       wc  -c core:用於統計檔案中的位元組數     (這一段講述了關於檔案空洞問題)

12、檔案截短:

原型:#includeint truncate(const char* pathname, off_t length);

int ftruncate(int filedes, off_t length);    成功返回0,失敗返回-1

將現有的檔案長度截短為length長度,若length長於原來長度,則會產生空洞。

13、檔案系統:i節點記錄了檔案的大部分資訊:鏈結計數(stat的st_nlink成員)、檔案型別、檔案訪問許可權等等。只有兩項資訊放在目錄項中:檔名和i節點編號。

兩個目錄想指向同乙個i節點叫做硬鏈結(nlink_t)、符號鏈結(s_iflnk)

18、utime函式:更改乙個檔案的訪問和修改時間。

原型:#includeint utime(const char* pathname, const struct utimbuf *times);

struct utimbuf   times是null則設定當前時間。

19、mkdir和rmdir函式:建立目錄和刪除目錄

原型:#includeint mkdir(const char* pathname, mode_t mode);

#includeint rmdir(const char* pathname);   用於刪除乙個空目錄。

20、讀目錄:

#include

dir *opendir(const char* pathname);    返回值:若成功返回指標,若出錯返回null

struct dirent *readdir(dir* dp);       返回值:若成功返回指標,若出錯返回null

void rewinddir(dir* dp);         

int closedir(dir* dp);                 返回值:若成功返回0,若出錯返回-1

long telldir(dir *dp);         返回值:與dp關聯的目錄中的當前位置

void seekdir(dir* dp, long loc);

struct dirent

注意:程式清單4-7用到了函式path_alloc(),但是程式中沒定義,編譯無法通過。我的解決方法是自己定義乙個path_alloc(),簡單方便。

char*path_alloc(int* size)

程式清單4-7用到了opendir,readdir,closedir。

21、chdir、fchdir和getcwd函式

程序通過呼叫chdir和fchdir函式可以更改當前工作目錄:#includeint chdir(const char* pathname);       int fchdir(int filedes);   這兩個函式分別用pathname或開啟的檔案描述符來指定新的當前工作目錄。         注意:當前工作目錄是程序的乙個屬性,所以chdir函式不會影響別的程序。

#includechar*  getcwd(char* buf, size_t size);                  得到完整路徑名。

22、裝置特殊檔案:(1)、系統中與每個檔名關聯的st_dev值是檔案系統的裝置號,只有字元特殊檔案和塊特殊檔案才有st_rdev值。 

綠色通道:

好文要頂

關注我收藏該文

與我聯絡

Unix環境高階程式設計 2版

1.簡單實現 ls include opendir readdir closedir 2.將標準輸入複製到標準輸出 include n read stdin fileno,buf,4096 write stdout fileno,buf,n 3.執行時限制 include long sysconf ...

unix環境高階程式設計 訊號(2)

函式kill和raise kill函式將訊號傳送給程序或程序組,raise函式則執行程序向自身傳送訊號。kill的pid引數有以下四種不同情況 pid 0,將該訊號傳送給程序id為pid的程序 pid 0,將該訊號傳送給與傳送程序屬於同一程序組的所有程序。pid 0 將該訊號傳送給程序組id等於pi...

UNIX環境高階程式設計學習筆記

include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...