文件和目錄
上一節(jié)主要講述文件IO伏伯,這一節(jié)內(nèi)容是文件系統(tǒng)的其他特征和文件的性質(zhì)橘洞。
1.函數(shù)stat、fstat说搅、fstatat和lstat
本節(jié)主要討論四個函數(shù):
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf );
int fstat(int fd, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf );
int fstatat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag);
/* 返回值:成功返回0炸枣,失敗返回-1 */
stat返回命名文件有關的信息結構;fstat獲得描述符fd
上打開文件的有關信息弄唧;lstat類似stat适肠,但是當命名文件是一個符號鏈接時返回該符號鏈接的有關信息而不是符號鏈接引用的文件,用于降序遍歷目錄層次結構候引;fstatat為一個相對于當前打開目錄(fd
指向)的路徑名返回文件統(tǒng)計信息侯养,第二個參數(shù)buf是一個指針,指向我們必須提供的結構澄干。
2.文件類型
Unix文件類型包括下面幾種:
- 普通文件逛揩,包含某種形式的數(shù)據(jù)
- 目錄文件,包含其他文件的名字以及指向與這些文件有關信息的指針麸俘,對一個目錄文件具有讀權限的任意進程都可以讀該目錄內(nèi)容辩稽,但是只有內(nèi)核可以直接寫目錄文件
- 塊特殊文件,這種類型的文件提供對設備帶緩沖的訪問从媚,每次訪問以固定長度為單位進行
- 字符特殊文件搂誉,提供對設備不帶緩沖的訪問,每次訪問長度可變
- FIFO静檬,用于進程間通信炭懊,有時也稱為命名管道
- 套接字,用于進程間網(wǎng)絡通信
- 符號鏈接拂檩,用于指向另一個文件
3.設置用戶ID和組ID
與一個進程關聯(lián)的ID:
ID | 含義 |
---|---|
1.實際用戶ID和實際組ID | 標志用戶實際是誰 |
2.有效用戶ID侮腹、有效組ID和附屬組ID | 用于文件訪問權限檢查 |
3.保存的設置用戶ID和設置組ID | 由exec函數(shù)保存 |
4.access和faccessat
這兩個函數(shù)是按實際用戶ID和實際組ID進行訪問權限測試:
#include <unistd.h>
int access(const char *pathname, int mode);
int faccessat(int fd, const char *pathname, int mode, int flag);
/* 返回值:成功0,失敗-1*/
如果測試文件存在稻励,mode
就為F_OK父阻,否則mode
按下表位或:
mode | 說明 |
---|---|
R_OK | 測試讀權限 |
W_OK | 測試寫權限 |
X_OK | 測試執(zhí)行權限 |
5.umask
umask為進程設置文件模式創(chuàng)建屏蔽字,并返回之前的值:
#include <sys/stat.h>
mode_t umask(mode_t cmask);
/* 返回值:之前文件模式創(chuàng)建的屏蔽字*/
6.chmod望抽、fchmod和fchmodat
這三個函數(shù)用于改變現(xiàn)有文件的訪問權限:
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
int fchmodat(int fd, const char *pathname, mode_t mode, int flag);
/* 返回值:成功返回0加矛,失敗返回-1 */
chmod函數(shù)在指定文件上進操作,而fchmod函數(shù)則在已打開文件進行操作煤篙,fchmodat中斟览,flag
可以改變fchmodat的行為。
7.文件截斷
調(diào)用函數(shù)truncate和ftruncate可以截斷文件:
#include <unistd.h>
int truncate(const char *pathname, off_t length); int ftruncate(int fd, off_t length);
/* 返回值:成功0辑奈,失敗-1*/
將現(xiàn)有文件長度截斷為length
苛茂,如果文件以前長于length
則超過length
部分不能訪問,若以前文件小于length
則文件長度增加鸠窗,以前文件尾部和新的文件尾部直接產(chǎn)生空洞妓羊。
8.文件系統(tǒng)
首先介紹Unix文件系統(tǒng)的基本結構,我們可以把一個磁盤分為一個或多個分區(qū)稍计,每個分區(qū)可以包含一個文件系統(tǒng)躁绸。i節(jié)點是固定長度的記錄項,包含有關文件的大部分信息:
進一步i節(jié)點(索引節(jié)點)的結構:
- 在圖中有兩個目錄項指向同一個i節(jié)點臣嚣,每個i節(jié)點有一個鏈接計數(shù)净刮,其值表示指向該i節(jié)點的目錄項數(shù),在stat結構中茧球,鏈接計數(shù)包含在
st_nlink
成員中庭瑰,這種鏈接稱為硬鏈接 - 對應硬鏈接存在一種符號鏈接,符號鏈接的實際內(nèi)容包含了該符號鏈接所指向的文件的名字抢埋。
- i節(jié)點包含了文件有關的所有信息:文件類型弹灭、文件訪問權限位、文件長度和指向文件數(shù)據(jù)塊的指針等揪垄。
9.符號鏈接
符號鏈接是對一個文件的間接指針穷吮,與硬鏈接不同,硬鏈接直接指向文件的i節(jié)點饥努。引入符號鏈接的原因是避開硬鏈接的一些限制:
- 硬鏈接通常要求鏈接和文件位于同一文件系統(tǒng)
- 只有超級用戶才能創(chuàng)建指向目錄的硬鏈接
對于符號鏈接以及它指向何種對象并無任何文件系統(tǒng)限制捡鱼,任何用戶都可以創(chuàng)建指向目錄的符號鏈接。符號鏈接一般用于將一個文件或整個目錄結構移到系統(tǒng)中另一個位置酷愧。
當使用以名字引用文件的函數(shù)時驾诈,應當了解該函數(shù)是否處理符號鏈接缠诅。也就是該函數(shù)是否跟隨符號鏈接到達它所鏈接的文件。如果該函數(shù)具有處理符號鏈接的功能乍迄,則其路徑名參數(shù)引用由符號鏈接指向文件管引。否則,一個路徑名參數(shù)引用鏈接本身闯两,而不是由該鏈接指向的文件褥伴。
函數(shù) | 是否跟隨符號鏈接 |
---|---|
access | y |
chdir | y |
chmod | y |
chown | y |
creat | y |
exec | y |
lchown | n |
link | y |
lstat | n |
open | y |
opendir | y |
pathconf | y |
readlink | n |
remove | n |
rename | n |
stat | y |
truncate | y |
unlink | n |
小結
這節(jié)內(nèi)容真的很多,涉及到很多用戶權限問題漾狼,比較難消化重慢。