本文涵蓋 link/unlink/remove/rename 連接操作、符號連接機制、文件三個時間屬性及 utime 修改時間的權限規則。
#includeint link(const char *existingpath, const char *newpath); // 成功返回 0,失敗 -1
為現存文件 existingpath 創建新目錄項 newpath,指向同一 i-node。若 newpath 已存在則報錯。硬連接不跨文件系統。
#includeint unlink(const char *pathname); // 成功 0,失敗 -1
刪除目錄項,連接計數 -1。只有當連接計數歸零且無進程打開該文件時,數據塊才會被釋放。若有進程打開,刪除延遲至最後一個文件描述符關閉時。
#includeint remove(const char *pathname);
對文件等同 unlink,對目錄等同 rmdir。
#includeint rename(const char *oldname, const char *newname);
文件重命名:若 newname 存在且非目錄,先刪除再重命名。需對包含兩路徑的目錄有寫權限。
目錄重命名:newname 必須為空目錄。不可將父目錄重命名為子目錄路徑(如 /usr/foo → /usr/foo/dir)。
同源優化:若 oldname 與 newname 指向同一文件,直接返回成功。
符號連接是文件的間接指標,儲存目標路徑字符串。rmdir 對符號連接報錯。各函數對符號連接的處理差異見下圖:

#includeint symlink(const char *actualpath, const char *sympath);
不要求 actualpath 存在,可跨文件系統。open 預設跟隨符號連接,需用 readlink 讀取連接本身內容。
#includeint readlink(const char *pathname, char *buf, int bufsize); // 成功返回讀取字節數,不以 null 結尾
結合了 open/read/close 操作。返回的目標路徑不自動添加結束符。


目錄操作(增刪改目錄項)影響父目錄三時間;文件讀寫僅影響文件自身 i-node 時間,不影響父目錄。
#include#include int utime(const char *pathname, const struct utimbuf *times); // 成功 0,失敗 -1 struct utimbuf { time_t actime; time_t modtime; };
兩種模式:
注意:st_ctime 不可手動修改,調用 utime 時會自動更新為當前時間。