文件屬性
1. 本章引言
上一章通過學習文件io,知道了如何使用文件io來打開文件,對文件進行讀寫等操作,那么我們這一章將換一個角度,專門圍繞文件屬性進行相關的討論。
1.1 什么是文件屬性?
我們通過ls查到就是文件屬性,只不過ls只顯示了部分文件屬性。
1.2 本章講什么
本章專門介紹操作文件屬性的各種OS API,比如獲取文件的讀寫權限、文件的大小、文件的創建時間等。
1.3 本章的意義
本章操作文件屬性的OS API,使用的不像文件io的OS API那樣頻繁,但是學習本章可以讓你深入的理解有關文件這個東西,所以非常希望大家能夠認真對待本章內容。
1.4 本章涉及到的OS API有哪些?
stat、fstat、lstat
umask
chmod、fchmod
chown,fchown,lchown
link,unlink,remove,rename
symlink和readlink
chdir、和getcwd
看起來很多,不過每一行都是一組,只要理解其中一個,其它的都很好理解。
而且這些函數,都與我們常用的cd、ls、chmod、chown、pwd等命令息息相關,大家之前就已經熟悉了這些命令,
所以開解這些函數時,並不會覺得困難。
同樣的,對於這些函數,不要去記,關鍵是理解,如果用到時,你能夠查閱man手冊后者資料,快速的把它用起來,就說明你學明白了。
2. 回顧文件7種類型
之前將Linux基礎的時候說過,在Linux下一切皆是文件,從應用層(應用程序層)看待底層機制時,皆以文件的方式來看待這些機制。
但是不同的底層機制,畢竟是不同的,比如底層驅動程序,就分為字符設備驅動和塊設備驅動,根據底層機制的不同,文件被分
為了7種類型。
2.1 文件的7種類型
我們在學習《Linux基礎初級》時講過,Linux一切皆文件,文件一共分為7類分別是- d c s p l b。
(1)普通文件(regular file:-)
1)普通文件根據存放的內容的不同,又分為如下兩種
(a)文本文件
存放的都是文字編碼,文本編輯器打開后,會將這些文字編碼翻譯為文字圖形,以供人識別。
(b)純二進制文件(機器碼)
比如經過編譯后得到的可執行文件,里面放的是cpu執行的純二進制機器碼,由於文編編輯器只認識文字編碼,所以
用文本編輯器打開后,顯示的內容無法是錯亂的,無法辨識。
其實不管存放的是文字編碼,還是機器碼,在計算機中存儲時,其實都是以二進制形式存放的,只不過我們這里可刻
意的把機器碼這類非文字編碼的數據,特意強調為了二進制數據。
2)以存儲5為例
(a)以‘5’存儲:在文件中存放的是'5'的ASCII碼為53(??00110101?),在計算機中實際存放的是?00110101?。
(b)以整數5存儲:文件中實際存放是整數5(00000101),在計算機中實際存放的是00000101。
對linux內核而言,這兩種文件並無區別,至於文件中的數據如何解釋,則由處理這些數據的應用程序(比如文本編輯器)
來決定。
不管是文字編碼數據,還是純二進制數據,應用程序調用read、write讀寫文件時,沒有任何區別。
(2)目錄文件(director file:d)
目錄是一種特殊的文件,專門用於管理其它文件。
(3)字符設備文件(character special file:c)
字符設備文件,就是字符設備驅動程序,在上層的表現形式。
當應用程序調用底層字符設備驅動程序,實現對某個字符設備進行讀寫時,上層就需要對接底層的字符驅動程序,字符設備驅動
在上層,會以“字符設備文件”的形式表現出來,我們通過open、read、write去讀寫字符設備文件,就實現了和底層字符設備驅動
程序的交互。
(4)塊設備文件(block special file:b):對應塊設備(如磁盤等)。
1)塊設備文件,是塊設備驅動程序在上層的表現形式。
2)字符設備與塊設備有什么區別?
(a)字符設備
以字節為單位來操作數據。
比如:鍵盤、鼠標、顯示器都等是字符設備。
字符設備的驅動程序,就稱為“字符設備驅動程序”。
(b)塊設備
塊設備存儲的數據量往往非常大,為了提高讀寫效率,都是以塊(1024字節)為單位來操作數據。
比如:電腦硬盤、移動硬盤、u盤等,凡是涉及大量數據存儲的,都是以塊為單位來操作數據的,都是塊設備。
塊設備的驅動程序,就稱為“塊設備驅動程序”。
(5)FIFO(fifo:p)
管道文件,用於實現不同進程(程序)之間的通信,管道是OS提供的一種純代碼層面的通信機制。
數據 數據
A進程 ————————> 管道文件 ————————>B進程
后面講進程間通信時,會具體講到管道這個東西。
(6)套接字文件(socket:s)
專門用於網絡通信的文件。
講到網絡編程時,再來具體介紹。
(7)符號連接(symbolic link:l):
我們在Linux基礎中講過了,其實就是一種快捷圖標,背后指向了另外一個文件。
這7類文件,其中普通文件數量最多,其次是目錄文件,然后才是其它類的文件。
2.2 如何判斷文件的類型
(1)ls查看- d c l b s p符號來區分
(2)可以使用file命令來查看
1)查看普通文件
(a)如果查看的是文本文件
會提醒你,它是文字編碼格式的文件。
(b)如果你查看的是純二進制文件(機器碼)
會提示你,這是一個可以運行的可執行文件。
a.out: ELF 64-bit LSB executable, x86-64, dynamically linked,
/lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, not strippe
· ELF:Linux下可執行文件的格式,Windows下的可執行文件是PE格式
對應格式的可執行文件,只能在對應的OS下運行。
· 64-bit:文件里面的機器指令是64位的
· LSB:小端序,C語言里面有詳細介紹大小端序
· executable:明確告訴你,該文件是一個可執行文件
· x86-64:運行的是intel的i386的、64位的cpu
· dynamically linked, /lib64/ld-linux-x86-64.so.2
程序使用的庫是動態鏈接庫,庫名叫/lib64/ld-linux-x86-64.so.2
· for GNU/Linux 2.6.32:運行的系統是Linux系統(ubuntu),Linu x 2.6.32是ubuntu所用Linux內核的版本號
· not strippe:程序沒有被瘦身,里面包含有各種用於調試用的信息,當這個程序最終發布時,會使用strip命令
為程序瘦身,去除里面的無用信息,讓程序變的更小。
2.3 如何對這些文件進行IO操作
在我們整個課程中,這7類文件都會涉及到,對文件進行IO操作時,使用的都是第1章講的各種文件io函數,從這里也可以看出,
所以第1章的內容很重要。