首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

APUE 文件與目錄操作(中):硬連接、符號連接、文件時間與 utime 函數詳解

     編輯:關於C語言

APUE 文件與目錄操作進階:連接、時間屬性與權限控制

本文涵蓋 link/unlink/remove/rename 連接操作、符號連接機制、文件三個時間屬性及 utime 修改時間的權限規則。

一、硬連接操作函數族

1. link - 創建硬連接

#include 
int link(const char *existingpath, const char *newpath);
// 成功返回 0,失敗 -1

為現存文件 existingpath 創建新目錄項 newpath,指向同一 i-node。若 newpath 已存在則報錯。硬連接不跨文件系統。

2. unlink - 刪除目錄項

#include 
int unlink(const char *pathname);
// 成功 0,失敗 -1

刪除目錄項,連接計數 -1。只有當連接計數歸零且無進程打開該文件時,數據塊才會被釋放。若有進程打開,刪除延遲至最後一個文件描述符關閉時。

3. remove - 統一刪除接口

#include 
int remove(const char *pathname);

對文件等同 unlink,對目錄等同 rmdir。

4. rename - 重命名/移動

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

文件重命名:若 newname 存在且非目錄,先刪除再重命名。需對包含兩路徑的目錄有寫權限。
目錄重命名:newname 必須為空目錄。不可將父目錄重命名為子目錄路徑(如 /usr/foo → /usr/foo/dir)。
同源優化:若 oldname 與 newname 指向同一文件,直接返回成功。

二、符號連接

符號連接是文件的間接指標,儲存目標路徑字符串。rmdir 對符號連接報錯。各函數對符號連接的處理差異見下圖:

符號連接處理差異表

三、symlink 與 readlink

symlink - 創建符號連接

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

不要求 actualpath 存在,可跨文件系統。open 預設跟隨符號連接,需用 readlink 讀取連接本身內容。

readlink - 讀取連接目標

#include 
int readlink(const char *pathname, char *buf, int bufsize);
// 成功返回讀取字節數,不以 null 結尾

結合了 open/read/close 操作。返回的目標路徑不自動添加結束符。

四、文件三個時間屬性

文件三個時間

  • st_atime:最後訪問時間(讀)
  • st_mtime:最後修改時間(寫內容)
  • st_ctime:最後狀態變更時間(i-node 變更:權限、所有者、連接計數等)

各函數對三時間影響表

目錄操作(增刪改目錄項)影響父目錄三時間;文件讀寫僅影響文件自身 i-node 時間,不影響父目錄。

五、utime 函數修改時間

#include 
#include 
int utime(const char *pathname, const struct utimbuf *times);
// 成功 0,失敗 -1
struct utimbuf { time_t actime; time_t modtime; };

兩種模式:

  1. times == NULL:將 atime/mtime 設為當前時間。需:有效 UID = 文件擁有者 或 對文件有寫權限。
  2. times != NULL:設為指定值。需:有效 UID = 文件擁有者 或 進程為 root。單純寫權限不足夠。

注意:st_ctime 不可手動修改,調用 utime 時會自動更新為當前時間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved