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

APUE 文件與目錄操作(上):用戶 ID、文件權限、粘著位、文件系統核心結構

     編輯:關於C語言

APUE 文件系統基石:ID 體系、權限模型、inode 與目錄結構

本文系統梳理進程 6 類 ID 差異、文件權限位語義、粘著位演變、文件截斷、傳統 UNIX 文件系統佈局與 inode/目錄項關係。

一、進程六大 ID 體系

ID 類型含義典型值
Real UID/GID執行程式的真實用戶/組登入用戶 orlion
Effective UID/GID訪問控制決策依據通常=Real,setuid 時不同
Saved Set-UID/GIDexec 時保存的 Effective 副本用於權限切換還原
Supplementary GIDs附屬組 ID 列表用戶屬於的所有組

Set-UID 機制實戰

/usr/bin/passwd 權限 -rwsr-xr-x(s 位 = Set-UID):

// 測試程式
printf("Real UID: %d, Effective UID: %d\n", getuid(), geteuid());

// 普通用戶運行: Real=1000, Eff=1000
// root 執行 chown root a.out && chmod u+s a.out
// 再運行: Real=1000, Eff=0(root)

Set-UID 讓普通用戶臨時獲得文件擁有者(通常是 root)權限,完成特權操作(如修改 /etc/passwd)。

二、chmod/fchmod 權限修改

#include 
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

mode 為位掩碼組合:

  • S_ISUID Set-UID、S_ISGID Set-GID、S_ISVTX 粘著位
  • S_IRWXU 用戶讀寫執行、S_IRUSR 讀、S_IWUSR 寫、S_IXUSR 執行
  • 組/其他權限對應 S_IRWXG/S_IRWXO 等

需:Effective UID = 文件擁有者 或 root。

三、粘著位演變與現代用途

  • 早期:可執行文件設粘著位 → 程式文本駐留交換區 → 加速後續載入
  • 現代:虛存系統已無此需求,轉用於目錄
  • 目錄粘著位:/tmp、/var/spool/uucppublic 等公共寫入目錄設 +t(drwxrwxrwt)
  • 效果:只有文件擁有者、目錄擁有者或 root 可刪除/重命名目錄下文件,防止用戶誤刪他人文件

四、chown/fchown/lchown 所有權變更

int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);  // 不跟隨符號連接

_POSIX_CHOWN_RESTRICTED 生效時:

  1. 非 root 不可更改文件 UID
  2. 非 root 只能將自己文件的 GID 改為自己所屬組之一
  3. 非 root 成功調用會清除 Set-UID/Set-GID 位

五、文件長度與截斷

  • st_size:普通文件/目錄/符號連接的字節數。目錄通常為 16/512 倍數
  • truncate(path, len)/ftruncate(fd, len):縮短文件。超出部分不可訪問;擴展行為實現相關(可能以 0 填充)

六、傳統 UNIX 文件系統佈局

文件系統佈局

  • 啟動塊、超級塊、inode 表、數據塊區
  • inode:固定長度記錄,含類型、權限、長度、時間、數據塊指標陣列
  • inode 結構

七、硬連接與符號連接本質

  • 硬連接:目錄項直接指向 inode。st_nlink 計數。不可跨文件系統,不可連接目錄
  • 符號連接:文件數據塊存儲目標路徑字符串。可跨文件系統,可連接目錄
  • 目錄項:僅含 文件名 + inode 號。stat 多數信息來自 inode

八、目錄連接計數規律

目錄連接計數

  • 葉目錄(無子目錄):st_nlink = 2(父目錄項 + 自身 . 項)
  • 非葉目錄:st_nlink ≥ 3(父目錄項 + . + 每個子目錄的 .. 項)
  • 根目錄 .. 指向自身
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved