APUE讀書筆記(二) 檔案和目錄

2021-07-05 15:29:06 字數 4239 閱讀 2911

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