APUE 檔案和目錄 中

2021-09-08 22:41:35 字數 2848 閱讀 7205

乙個檔案可以有多個目錄項指向其i節點。使用link函式可以建立乙個指向現存盤案連線

#include int link(const char *existingpath, const char *newpath); 返回值:成功為0,出錯為-1

該函式建立乙個新目錄項newpath,指向現存盤案existingpath,如果newpath已存在則返回出錯。

為了刪除乙個現存的目錄項,可以呼叫unlnk函式。

#include int unlink(const char *pathname); 返回值:成功為0,出錯為-1

此函式刪除目錄項,並將pathname引用的檔案的連線計數-1。 只有當連線計數達到0時該檔案的內容才能被刪除,如果有程序開啟了該檔案其內容也不能刪除。關閉乙個檔案時核心首先檢查使該檔案開啟的程序計數,如果該計數為0再檢查連線計數,如果為0那就刪除該檔案。

使用remove函式可以解除對乙個檔案或目錄的連線,對於檔案,remove的功能與unlink相同。對於目錄,remove的功能與rmdir相同。

#include int remove(const char *pathname);

檔案或目錄用rename函式重新命名

#include int rename(const char *oldname, const char *newname);

根據oldname是目錄還是檔案有兩種情況:

(1) 如果oldname是乙個檔案則為該檔案更名。在這種情況下,如果newname已存在,則它不能引用乙個目錄。如果newname已存在,而且不是乙個目錄,則先將該目錄項(這裡不是目錄!)刪除然後將oldname更名為newname。對包含oldname和newname的目錄,呼叫程序必須具有寫許可權,因為將更改這兩個目錄。

(2) 如果oldname說明乙個目錄,那麼為該目錄重新命名。如果newname已存在,則它必須引用乙個目錄,而且該目錄應當是空目錄。如果newname存在而且是乙個空目錄,則先將其刪除,然後將oldname更名為newname。不能將/usr/foo更名為/usr/foo/dir,因為oldname /usr/foo是newname /usr/foo/dir的字首,無法刪除。可以將/tmp/orlion/b/(假如該資料夾下有個c檔案)更名為/tmp/orlion_1/,修改完成後可以看到orlion_1資料夾下有個c檔案。

(3) 如果oldname和newname引用同乙個檔案,則不做任何修改而返回成功。 如果newname已存在,則程序必須需要對其有寫許可權(如同刪除一樣)。另外程序將刪除oldname目錄項,並可能要建立newname目錄項,所以它需要對包含oldname及包含newname的目錄具有寫和執行權。

符號鏈結是對乙個檔案的間接指標。rmdir函式如果path是符號鏈結則返回出錯,所以下表沒有列出各個函式對符號連線的處理如下:

symlink函式建立乙個符號連線。

#include int symlink(const char *actualpath, const char *sympath);

在建立符號連線時並不要求actualpath存在。並且不要求actualpath和sympath在同一檔案系統中而硬連線要求。 因為open函式會跟隨符號連線(即實際開啟的是符號連線連線的檔案),所以需要一種方法開啟該連線本身,readlink提供了這種功能。

#include int readlink(const char *pathname, char *buf, int bufsize);

此函式組合了open,read和close的所有操作。 如果成功則返回讀入buf的位元組數如果失敗則返回-1。在buf返回的檔案鏈結的內容不以null字元終止。

每個檔案有三個時間段,如下圖:

下表是各種函式對這三個時間的作用。 目錄是包含目錄項(檔名和相關的i節點)的檔案,增加、刪除或修改目錄項會影響到與其所在目錄相關的三個時間。例如,建立乙個新檔案會影響到包含該檔案的目錄(因為目錄實質上是包含該檔案的檔案),也影響新檔案的i節點,但是讀或寫只影響該檔案的i節點,而對父目錄則無影響。

乙個檔案的訪問和修改時間可以用utime函式更改。

#include int utime(const char *pathname, const struct utimbuf *times); 返回值:成功0,失敗-1.

此函式所使用的結構是:

struct utimbuf 

結構體中的兩個時間都是unix時間戳。

此函式的操作以及執行它所要求的優先權取消於times引數是否是null。

(1) 如果times是乙個空指標,則訪問時間和修改時間兩者都設定為當前時間。為了執行次操作必須滿足兩條件之一(a)程序的有效使用者id必須等於該檔案的所有者id,(b)程序對該檔案必須具有寫許可權。

(2) 如果times是非空指標,則訪問時間和修改時間被設定為times所指向的結構體中的值。此時,程序的有效使用者id必須等於該檔案的所有者或者程序是乙個root程序。對檔案只有寫許可權是不夠的。

不能修改檔案的狀態時間st_ctime,當呼叫utime時,此字段被自動更新。

APUE 檔案和目錄 中

乙個檔案可以有多個目錄項指向其i節點。使用link函式可以建立乙個指向現存盤案連線 include int link const char existingpath,const char newpath 返回值 成功為0,出錯為 1 該函式建立乙個新目錄項newpath,指向現存盤案existing...

APUE筆記 檔案和目錄

4.10 粘著位 在早期的作業系統中,未使用分頁技術。程式在磁碟上是隨機儲存的,則在裝入程式是會耗費較大的時間,為保證下次執行程式時能將程式正文快裝入記憶體,作業系統在磁碟上開闢了塊交換區。交換區的檔案是連續儲存的,裝入速度相對會更快。現在作業系統使用分頁技術,因此不再使用這種技術。但一般都擴充套件...

APUE 檔案和目錄 二

link,unlink,remove和rename函式 include int link const char existingpath,const char newpath 返回 若成功則為0,若出錯則為 1 為了刪除乙個現存的目錄項,可以呼叫unlink函式。include int unlink...