APUE筆記 檔案和目錄

2021-06-29 08:33:20 字數 3883 閱讀 9200

4.10 粘著位

在早期的作業系統中,未使用分頁技術。程式在磁碟上是隨機儲存的,則在裝入程式是會耗費較大的時間,為保證下次執行程式時能將程式正文快裝入記憶體,作業系統在磁碟上開闢了塊交換區。交換區的檔案是連續儲存的,裝入速度相對會更快。

現在作業系統使用分頁技術,因此不再使用這種技術。但一般都擴充套件了這個位:

在檔案的mod中s_isvtx 位,表示粘著位,現代os常用來限制一般使用者對目錄下檔案的刪除和重新命名檔案操作,但提供讀寫操作!

現代os中如果設定了目錄i_svtx位,則只有擁有寫許可權,且擁有下列之一的許可權才能刪除和重新命名目錄下檔案:

1.擁有檔案

2.擁有目錄

3.超級使用者

chown(const char* pathname, uid_t owner, gid_t group);

fchown(int fd,  uid_t owner, gid_t group);

fchownat(int fd, const char* pathneme, uid_t owner, gid_t group, int flag);

lchown(const char* pathname, uid_t owner, gid_t group);

四個函式修改檔案的使用者id,組id;

當owner 或group 有乙個是-1時,id不變(owner,group 都不變)

_posix_chown_restricted:

有兩種關於檔案修改許可權的情況:

4.17符號鏈結

1)符號鏈結相對硬鏈結而言,硬連線是直接指向inode,而符號鏈結是在檔案的資料中記錄了檔案的名字。

硬連線的限制:

1.只能指向同一檔案系統(符號鏈結不是指向的inode所以可以指向任意系統)    2.指向目錄的硬連線只能由核心執行(os支援的前提下),為了防止迴圈鏈結(符號鏈結也能引起迴圈,一般查詢路徑的函式會錯誤返回,相比硬連線的檔案系統錯誤,此錯不會這麼致命)

2)在處理檔案時候要注意函式是否具有處理鏈結的能力

1.一般l開頭的都直接處理鏈結不延伸到所指檔案,lstat,lchown。。

2.f開頭的函式以fd為處理引數,對於鏈結處理的控制優open完成(open開啟是處理所指檔案,openat可指定是否follow鏈結)。

3.mdir,rmdir,mkinfo,mknod則在處理鏈結時直接返回-1

3)符號鏈結可能導致指向不存在的檔案,鏈結是不會檢查!

csl@ubuntu:~$ ln -s /no/file nofile

csl@ubuntu:~$ ls

csl@ubuntu:~$ cat nofile 

cat: nofile: no such file or directory

csl@ubuntu:~$

檔案ls顯示存在nofile ,卻讀不出來

4.18建立&讀取符號鏈結

建立鏈結

int symlink(const char* actualpath, const char* symblpath);

int symlinkat(int fd, const char * actualpath, int symfd, const char*sympath);

開啟鏈結本身,不讀所指檔案

int readlink(const char* sympath,char *rstrict buf, size_t size);

int readlinkat(int fd, const char* sympath, char* buf, suze_t size );

4.19檔案時間

st_atime 系統的最近訪問時間,注意之際錄資料的訪問時間,對屬性修改不會記錄

st_ctime系統的最近修改時間,記錄的是檔案inode的修改時間也就算屬性的修改時間,系統不記錄inod的訪問時間,也就是訪問系統哦功能屬性時時間不會記錄

st_mtime檔案資料的最近修改時間

遍歷檔案目錄

#include #include #include //s_isdir

#include #include #include //dirent dir

using namespace std;

int c = 2;

const int max = 256;

char *path;

int pathlen;

static void dopath();

static void myftw(const char *pathname)

path[n++] = '/';

path[n] = 0;

for(int i = 0; i < c; i++)cout << " ";

cout << path<<":"d_name, "..") == 0 )continue;

strcpy(path + n, direp->d_name);

c+= 2;

dopath();

c-=2;

} path[n - 1] = 0;

closedir(dirp);

}int main(int argc, const char *args)

4.24特殊裝置(待研究)

st_dev ,st_rdev通常dev_t 高為表示主裝置號,低若干位表示次裝置號

每個檔案系統所在的儲存系統主次裝置號

主裝置號標示驅動程式

次裝置號標示特定子裝置

只有字元裝置& 塊裝置才有st_rdev 值

major  minor兩個巨集可的主次裝置號值

du & df

du -sh命令通過將指定檔案系統中所有的目錄、符號鏈結和檔案使用的塊數累加得到該檔案系統使用的總塊數;

而df命令通過檢視檔案系統磁碟塊分配圖得出總塊數與剩餘塊數

檔案系統分配其中的一些磁碟塊用來記錄它自身的一些資料,如i節點,磁碟分布圖,間接塊,超級塊等。這些資料對大多數使用者級的程式來說是不可見的,通常稱為meta data。

du命令是使用者級的程式,它不考慮meta data,而df命令則檢視檔案系統的磁碟分配圖並考慮meta data。

因此正常情況下,df計算的used空間會比du計算的結果要稍大。



APUE 檔案和目錄 中

乙個檔案可以有多個目錄項指向其i節點。使用link函式可以建立乙個指向現存盤案連線 include int link const char existingpath,const char newpath 返回值 成功為0,出錯為 1 該函式建立乙個新目錄項newpath,指向現存盤案existing...

APUE 檔案和目錄 二

link,unlink,remove和rename函式 include int link const char existingpath,const char newpath 返回 若成功則為0,若出錯則為 1 為了刪除乙個現存的目錄項,可以呼叫unlink函式。include int unlink...

APUE 檔案和目錄 中

乙個檔案可以有多個目錄項指向其i節點。使用link函式可以建立乙個指向現存盤案連線 include int link const char existingpath,const char newpath 返回值 成功為0,出錯為 1 該函式建立乙個新目錄項newpath,指向現存盤案existing...