1. 函式stat
stat函式用於返回此命名檔案有關的資訊結構,我們平時使用的shell命令:ls -l就是呼叫的stat函式。
stat和lstat函式的區別:
當檔案為符號鏈結時,stat返回所引用的檔案資訊,即跟隨符號連線;而lstat返回的是符號鏈結本身的資訊,即不跟隨符號鏈結。
2. 檔案訪問許可權
實際使用者id:檔案所有者
有效使用者id:當前正在使用的
設定使用者id:當使用這個檔案時,會獲得他所有者的許可權
chmod u+s filename:開啟設定使用者id位
目錄包含兩項:檔名+指向各檔案的指標(即i節點)
1)ls 讀取目錄:需要目錄的讀許可權;
2)開啟檔案:需要檔案的相關許可權(以唯讀還是讀寫方式開啟),目錄的執行許可權(要通過指標找到檔案);
3)新增/刪除檔案:需要目錄的寫、執行許可權。而不需要對檔案本身具有許可權。
函式access和faccessat
一般情況都是按照檔案的有效許可權進行測試,而access/faccessat使用實際使用者/組id進行許可權測試。
用於按實際使用者id和實際組id進行訪問許可權測試。
也就是說,即使我們通過root許可權可以用open開啟的檔案,我們通過access函式也可以檢視實際使用者不能讀的檔案。
3. 函式umask
umask其實是遮蔽的功能,設定什麼位就是遮蔽什麼功能了,例如:
umask 027 的功能就是關閉了組的寫功能和其他的全部功能。
如果我們想確保任何使用者都能讀檔案,就將umask設為0。
4. 函式chmod
chmod更改的是i節點最近一次被更改的時間。
ls -l 列出的是最後修改檔案內容的時間。
5. 粘著位
如果乙個可執行檔案的這一位被設定了,那麼當該程式第一次被執行,並終止的時候,程式正文部分的乙個副本會被儲存在交換區中,使得下次再執行該程式的時候能夠很快的將其加載入記憶體中。
可是如今的unix系統都配置了虛擬儲存系統和快速檔案系統,就不需要這種技術了。
6. 函式chown
用於更改檔案的使用者id和組id。
7. 檔案長度
普通檔案的檔案長度可以為0。
ls -l filename 命令顯示的是檔案所佔的位元組數;
du -s filename 命令顯示的是檔案占用了多少個位元組塊(乙個位元組塊是512位元組);
通過測試發現有些檔案的 du -s 命令顯示的位元組塊數 x 512 之後的總位元組數要大於 ls -l 顯示的位元組數,問什麼?
因為如果檔案中有指標,ls -l 顯示的就是指標的大小,即 ls -l 顯示的是當前檔案的大小;而 du -s 是所佔資料塊的總和,包括了這些指標所指向的位址空間。
8. 檔案截斷
函式:truncate
或者開啟檔案的時候使用 o_trunc標誌。
9. 檔案系統
i節點包含了檔案有關的所有資訊:檔案型別、檔案訪問許可權位、檔案長度和指向檔案資料塊的指標等。
mv命令原理:當源目錄和目標目錄是同乙個檔案系統時,無須修改i節點,只需修改目錄項即可。(目錄項包含檔名和i節點編號)
每次新建乙個目錄,如:mkdir testdir後,產生3個鏈結和1個i節點目錄塊,分別是:testdir的目錄項指向新的i節點、.和..分別指向testdir的i節點和其父目錄。
鏈結為 linux 系統解決了檔案的共享使用,還帶來了隱藏檔案路徑、增加許可權安全及節省儲存等好處。
刪除檔案的確認過程:
1) 開啟該檔案的程序個數為0;
2) 鏈結計數為0;
3) 刪除檔案內容。
前面所說的這種鏈結是硬鏈結(hard link),還有一種軟鏈結(symbolic link),軟鏈結的i節點型別是s_iflnk,所以系統知道這是乙個符號鏈結。
// 1.只能對已存在的檔案建立硬連線
# link old.file hard.link
link: cannot create link `hard.link' to `old.file': no such file or directory
// 2.檔案有相同的 inode 號以及 data block
# link old.file hard.link | ls -li
total 8
660650 -rw-r--r-- 2 root root 25 sep 1
17:44 hard.link
660650 -rw-r--r-- 2 root root 25 sep 1
17:44
old.file
// 3.不能交叉檔案系統
# ln /dev/input/event5 /root/bfile.txt
ln: failed to
create hard link `/root/bfile.txt' => `/dev/input/event5':
invalid cross-device link
// 4.不能對目錄進行建立硬連線
# mkdir -p old.dir/test
# ln old.dir/ hardlink.dir
ln: `old.dir/': hard link not allowed for directory
# ls -if
660650 hard.link 657948 old.dir/ 660650 old.file
hard link不能對目錄建立的原因是:
因為目錄項裡面有.和..兩個目錄項,如果對目錄link的話會產生死迴圈。如果是軟鏈結的話我們可以通過unlink消除,因為unlink不跟隨符號鏈結;而如果是硬鏈結的話就很難消除了。
11. 臨時檔案的建立過程:
先建立檔案,然後立即unlink,這樣當這個函式結束之後就會立即**這個檔案的位址空間了。(就像createthreadc之後立即closehandle一樣)
注意我們在測試書中4-16這個例子的時候,採用的是 df 命令來檢視可用磁碟空間,為什麼不能用 du 呢?
因為 du 命令需要加 filename,而在 du . 的時候不會計算臨時檔案的空間,因為已經 unlink 了,可是由於程式中 sleep(15),所以這時臨時檔案還是占用了磁碟空間的,這個時候我們就要用 df 命令來檢視了。(df 的引數是磁碟而不是檔名,如:df /home)
12. 函式rename
可以對檔案或目錄重新命名。
13. 檔案的時間
ls 命令預設的顯示的是檔案最後的修改時間
ls -u 顯示檔案資料最後的訪問時間
ls -c 顯示i節點狀態最後的更改時間
例如:建立乙個新檔案影響到包含此新檔案的目錄,也影響到該新檔案的i節點。但是,讀或寫乙個檔案只影響該檔案的i節點,對目錄無影響。
檔案的訪問和修改時間可硬通過futimens、utimensat和utimes函式更改。
14. 函式chdir
用於更改當前工作目錄,即 cd 命令。
15.getcwd原理
用..找到上級目錄,然後讀取目錄項,找到其中i節點號與當前工作目錄i節點號相同的目錄項,獲得對應的檔名(目錄項包含檔名+i節點編號)。遞迴向上,直到遇到根,即可獲得完整工作路徑。
其實getcwd的應用場合就是:儲存當前工作目錄,便於返回。而我們可以使用open當前路徑的方式,儲存返回的fd,這樣可以避免pwd的遍歷的開銷。
APUE讀書筆記 CH3 檔案I O
鑑於buffer和cache其實是不同的東西,所以我不用書上所用的概念,buffer就是buffer,cache就是cahce。不明白的小夥伴傳送過去看看 看過這兩張圖,就明白 buffer 和 cache 之間區別 相對於iso c語言定義的標準i o,posix協議定義的是unbuffered ...
APUE 學習筆記 二 檔案I O
對於核心而言,所有開啟的檔案都通過檔案描述符引用,核心不區分文字檔案和二進位制檔案 open函式 o rdonly o wronly o rdwr create函式 close函式 關閉乙個檔案時還會釋放該程序加在該檔案上的所有記錄鎖 lseek函式 顯式地為乙個開啟的檔案設定其偏移量 每個開啟的檔...
《APUE》筆記(1) 檔案I O
1 概述 1 unix類作業系統最重要的兩個東東 程序和檔案 2 大多數檔案i o用到的5個函式 open,close,read,write,lseek.還有檔案屬性操作函式 dup,fcntl 3 unix類作業系統的檔案i o是不帶快取的i o unbuffered i o 2 檔案描述符 fi...