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...