1. 程式人生 > >linux中文件屬性

linux中文件屬性

區別 計算 不用 gedit 都在 找到 操作 gfs sig

一. linux系統如何管理文件

  1.1. 硬盤中的靜態文件和inode

    a. 文件平時都在存放在硬盤中的,硬盤中存儲的文件以一種固定的形式存放的,我們叫靜態文件。
    b. 一塊硬盤中可以分為兩大區域:一個是硬盤內容管理表項,另一個是真正存儲內容的區域。操作系統訪問硬盤時是先去讀取硬盤內容管理表,從中找到我們要訪問的那個文件的扇區級別的信息,然後再用這個信息去查詢真正存儲內容的區域,最後得到我們要的文件。
    c. 操作系統最初拿到的信息是文件名,最終得到的是文件內容。第一步就是去查詢硬盤內容管理表,這個管理表中以文件為單位記錄了各個文件的各種信息,每一個文件有一個信息列表(我們叫inode,i節點,其實質是一個結構體,這個結構體有很多元素,每個元素記錄了這個文件的一些信息,其中就包括文件名、文件在硬盤上對應的扇區號、塊號那些東西·····)

    PS:硬盤管理的時候是以文件為單位的,每個文件一個inode,每個inode有一個數字編號,對應一個結構體,結構體中記錄了各種信息。
    PS:聯系平時實踐,大家格式化硬盤(U盤)時發現有:快速格式化和底層格式化。快速格式化非常快,格式化一個32GB的U盤只要1秒鐘,普通格式化格式化速度慢。這兩個的差異?其實快速格式化就是只刪除了U盤中的硬盤內容管理表(其實就是inode),真正存儲的內容沒有動。這種格式化的內容是有可能被找回的。

  1.2. 內存中被打開的文件和vnode

    1.2.1. 一個程序的運行就是一個進程,我們在程序中打開的文件就屬於某個進程。每個進程都有一個數據結構用來記錄這個進程的所有信息(叫進程信息表),表中有一個指針會指向一個文件管理表,文件管理表中記錄了當前進程打開的所有文件及其相關信息。文件管理表中用來索引各個打開的文件的index就是文件描述符fd,我們最終找到的就是一個已經被打開的文件的管理結構體vnode

    1.2.2. 一個vnode中就記錄了一個被打開的文件的各種信息,而且我們只要知道這個文件的fd,就可以很容易的找到這個文件的vnode進而對這個文件進行各種操作。

二. linux中各種文件類型

  2.1. 普通文件(- regular file)

    (1)文本文件。文件中的內容是由文本構成的,文本指的是ASCII碼字符。文件裏的內容本質上都是數字(不管什麽文件內容本質上都是數字,因為計算機中本身就只有1和0),而文本文件中的數字本身應該被理解為這個數字對應的ASCII碼。常見的.c文件, .h文件 .txt文件等都是文本文件。文本文件的好處就是可以被人輕松讀懂和編寫。所以說文本文件天生就是為人類發明的。

    (2)二進制文件。二進制文件中存儲的本質上也是數字,只不過這些數字並不是文字的編碼數字,而是就是真正的數字。常見的可執行程序文件(gcc編譯生成的a.out,arm-linux-gcc編譯連接生成的.bin)都是二進制文件。
    (3)對比:從本質上來看(就是刨除文件屬性和內容的理解)文本文件和二進制文件並沒有任何區別。都是一個文件裏面存放了數字。區別是理解方式不同,如果把這些數字就當作數字處理則就是二進制文件,如果把這些數字按照某種編碼格式去解碼成文本字符,則就是文本文件。
    (4)我們如何知道一個文件是文件文件還是二進制文件?在linux系統層面是不區分這兩個的(譬如之前學過的open、read、write等方法操作文件文件和二進制文件時一點區別都沒有),所以我們無法從文件本身準確知道文件屬於哪種,我們只能本來就知道這個文件的類型然後用這種類型的用法去用他。有時候會用一些後綴名來人為的標記文件的類型。
    (5)使用文本文件時,常規用法就是用文本文件編輯器去打開它、編輯它。常見的文本文件編輯器如vim、gedit、notepad++、SourceInsight等,我們用這些文本文件編輯器去打開文件的時候,編輯器會read讀出文件二進制數字內容,然後按照編碼格式去解碼將其還原成文字展現給我們。如果用文本文件編輯器去打開一個二進制文件會如何?這時候編輯器就以為這個二進制文件還是文本文件然後試圖去將其解碼成文字,但是解碼過程很多數字並不對應有意義的文字所以成了亂碼。
    (6)反過來用二進制閱讀工具去讀取文本文件會怎麽樣?得出的就是文本文字所對應的二進制的編碼。

  2.2. 目錄文件(d directory)
    (1)目錄就是文件夾,文件夾在linux中也是一種文件,不過是特殊文件。用vi打開一個文件夾就能看到,文件夾其實也是一種特殊文件,裏面存的內容包括這個文件的路徑,還有文件夾裏面的文件列表。
    (2)但是文件夾這種文件比較特殊,本身並不適合用普通的方式來讀寫。linux中是使用特殊的一些API來專門讀寫文件夾的。

  2.3. 字符設備文件(c character)
  2.4. 塊設備文件(b block)
    (1)設備文件對應的是硬件設備,也就是說這個文件雖然在文件系統中存在,但是並不是真正存在於硬盤上的一個文件,而是文件系統虛擬制造出來的(叫虛擬文件系統,如/dev /sys /proc等)
    (2)虛擬文件系統中的文件大多數不能或者說不用直接讀寫的,而是用一些特殊的API產生或者使用的,具體在驅動階段會詳解。

  2.5. 管道文件(p pipe)
  2.6. 套接字文件(s socket)
  2.7. 符號鏈接文件(l link)

三. 常用文件屬性獲取

技術分享圖片
root@ubuntu:/mnt/hgfs/windows_share/baseC/APPNet# stat test.txt 
  File: ‘test.txt’
  Size: 0             Blocks: 0          IO Block: 1024   regular empty file
Device: 1ah/26d    Inode: 116117      Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-11-15 06:14:47.795103500 -0800
Modify: 2018-11-15 06:14:47.795103500 -0800
Change: 2018-11-15 06:14:47.795103500 -0800
 Birth: -
root@ubuntu:/mnt/hgfs/windows_share/baseC/APPNet# 
View Code

  3.1. stat、fstat、lstat函數簡介

    (3)linux命令行下還可以去用stat命令去查看文件屬性信息,實際上stat命令內部就是使用stat系統調用來實現的。
(4)stat這個API的作用就是讓內核將我們要查找屬性的文件的屬性信息結構體的值放入我們傳遞給stat函數的buf中,當stat這個API調用從內核返回的時候buf中就被填充了文件的正確的屬性信息,然後我們通過查看buf這種結構體變量的元素就可以得知這個文件的各種屬性了。
(5)fstat和stat的區別是:stat是從文件名出發得到文件屬性信息結構體,而fstat是從一個已經打開的文件fd出發得到一個文件的屬性信息。所以用的時候如果文件沒有打開(我們並不想打開文件操作而只是希望得到文件屬性)那就用stat,如果文件已經被打開了然後要屬性那就用fstat效率會更高(stat是從磁盤去讀取文件的,而fstat是從內存讀取動態文件的)。
(6)lstat和stat/fstat的差別在於:對於符號鏈接文件,stat和fstat查閱的是符號鏈接文件指向的文件的屬性,而lstat查閱的是符號鏈接文件本身的屬性。

linux中文件屬性