本文系統梳理進程 6 類 ID 差異、文件權限位語義、粘著位演變、文件截斷、傳統 UNIX 文件系統佈局與 inode/目錄項關係。
| ID 類型 | 含義 | 典型值 |
|---|---|---|
| Real UID/GID | 執行程式的真實用戶/組 | 登入用戶 orlion |
| Effective UID/GID | 訪問控制決策依據 | 通常=Real,setuid 時不同 |
| Saved Set-UID/GID | exec 時保存的 Effective 副本 | 用於權限切換還原 |
| Supplementary GIDs | 附屬組 ID 列表 | 用戶屬於的所有組 |
/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)。
#includeint 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)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 生效時:
st_size:普通文件/目錄/符號連接的字節數。目錄通常為 16/512 倍數truncate(path, len)/ftruncate(fd, len):縮短文件。超出部分不可訪問;擴展行為實現相關(可能以 0 填充)

st_nlink 計數。不可跨文件系統,不可連接目錄文件名 + inode 號。stat 多數信息來自 inode
st_nlink = 2(父目錄項 + 自身 . 項)st_nlink ≥ 3(父目錄項 + . + 每個子目錄的 .. 項).. 指向自身