Linux文件系統

在Linux下,一切皆文件。這是我們嵌入式Linux開發與應用這門課的老師經常掛在嘴邊的一句話。足以體現出在Linux操作系統中,對於一切資源的管理都是對文件的操作。

Linux系統中每一個分區都是一個文件系統,都有自己的目錄層次。Linux會將這些在不同分區的,單獨的文件系統按一定的方式形成一個系統的總目錄層次結構。

Linux下可以通過shell命令來操作文件,但是功能有一定限制;我們也可以通過系統調用或者C語言的庫函數對文件進行操作

  1. Linux下的文件主要包括兩方面的數據:文件本身所包含的數據,以及文件屬性,也稱爲元數據。

  2. 目錄在Linux下也是文件,稱爲目錄文件。目錄文件的內容是該目錄的目錄項,目錄項是該目錄下的文件和目錄相關的信息。每當創建一個新目錄的時候,OS會自動創建兩個目錄項——“.”和“..”

  3. Linux採用的是標準的目錄結構——樹形結構(B樹家族)

Linux既然採用了樹形結構的目錄形式,整個OS只有一棵文件樹,這樣方便OS對文件進行統一管理。Linux操作系統中的這顆文件樹的樹根叫做根文件系統,用“/”表示,可以通過使用cd /命令直接到達根目錄。各個磁盤是通過掛載以文件夾的形式訪問

根文件系統:

  • /bin:該目錄下存放供用戶使用的完成基本維護任務的命令.

  • /boot:該目錄下存放着和OS啓動時使用的一些核心文件。

  • /dev:該目錄中包含所有的系統設備文件。從該目錄可以訪問各種系統設備,它還包含了創建設備文件的MAKEDEV.

  • /home:該目錄存儲普通用戶的個人文件,每個用戶的主目錄均在/home下以用戶名命名的文件夾。

  • /etc:該目錄包含系統和應用軟件的配置文件。

  • /lib:該目錄存放着系統最基本的共享鏈接庫(相當於Windows下的DLL)和內核模塊。

  • /lib64:如果是64位系統,它會有這個,存放64程序的共享鏈接庫,同時也會有一個lib32.

  • /media:可移動設備的掛載點,OS通常把U盤等設備自動掛載到該目錄下。

  • /opt:第三方的軟件默認安裝到這個位置。並不是每個Linux發行版都會創建這個目錄。

  • /mnt:臨時用於掛載文件系統的。一般情況下這個目錄下是空的,在我們掛載分區的時候會在該目錄下創建目錄。

  • /proc:存在於內存中的虛擬文件系統,裏面保存了內核和進程的狀態信息。

  • /root:這是root(超級管理員)用戶的主目錄,於/home下的普通用戶目錄類型。

  • /sbin:供root用戶使用的可執行文件,多是系統管理命令。

  • /usr:靜態的用戶級應用程序。

  • /tmp:該目錄用於保存臨時文件。

Linux文件分類:

  1. 普通文件:用戶和OS的數據,程序等信息文件

  2. 目錄文件:Linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以目錄就是一張表。OS可以修改目錄文件,用戶只能讀目錄文件

  3. 設備文件:Linux下一切皆文件,設備也是文件。每一種I/O設備對應一個設備文件,存放於/dev下。

  4. 管道文件:這是Linux用於進程之間通信的文件,一個進程在管道這一段寫入數據,另一個進程在管道的另一端讀取數據。管道文件一般是FIFO文件。

  5. 鏈接文件:又被稱作符號鏈接文件,它提供了一種共享文件的方式。它包含了指向文件的指針。

通過ls -l可以查看文件類型和屬性

結果分多行顯示,距離說明一下每行顯示的意義。例如第一行exec這個文件的信息行。首先,我們看到這行以“-”開頭,表示exec是一個普通文件。同時注意到第三行以d開頭,這說明new是一個目錄文件。

  • -:表示普通文件
  • d:表示目錄文件
  • l:表示鏈接文件
  • c:表示字符設備
  • b:表示塊文件
  • p:表示管道文件
  • f:表示堆棧文件

接着看第一個符號後面的信息,注意到後面仍舊有9個字符。這9個字符分成3組,即每3個一組,”w"表示可寫,“r”表示可讀,“x”表示可執行。第一組3個符號表示的是文件擁有者對該文件的權限;第二組3個符號表示該文件所在組的其他擁有者對該文件的權限;第3組表示系統其他用戶對該文件的權限。

繼續可以看到有個數字,對於普通文件,這個數字表示鏈接數,對於目錄文件來說這個數字表示第一級子目錄數。接下來的兩組信息分別是用戶名和組名,然後是文件大小(單位是字節),接着是文件最後的修改日期,最後就是文件名。

Linux文件描述符

在Linux下當一個進程打開文件的時候,OS會返回相應的文件描述符,程序爲了處理該文件必須使用這個文件描述符。文件描述符是一個正整數。一般而已,當一個進程啓動的時候,他會打開3個文件:標準輸入,標準輸出,標準錯誤。這3個文件對應的文件描述符分別是0,1,2.通常使用宏:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO.文件描述符是一個索引,指向內核中打開文件的記錄表。

Linux操作系統給我們提供了6個系統調用create,open,write,close,read,lseek。系統調用是不帶緩衝區的。他們是POSIX標準提供的。這些函數需要的頭文件#include<fcntl.h>,#include<sys/types.h>,#include<sys/stat.h>。

create函數用於創建一個文件,它的功能可以被open函數取代,open函數由3個參數的時候,就可以當做create函數使用,這時如果文件不存在,open就會創建這樣一個文件。

read函數用於從已打開的文件中讀取數據

write函數用於講數據寫入已打開的文件中

close函數用於關閉文件

lseek函數用於移動文件的讀寫位置。

一個簡單的例子如下:

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    int fd,size;
    int l;
    char str[] = {"This is My Schoolnumber:1507050314"};
    char tmp[51] = {0};
    fd = creat("hello.txt",(S_IRUSR|S_IWUSR));     //在當前目錄創建一個hello.txt文件,他是可讀可寫的。
    write(fd,str,strlen(str));    //寫入This is My Schoolnumber:這句話
    close(fd);                        //關閉文件
    open("hello.txt",O_RDONLY);       //以只讀方式打開文件
    read(fd,tmp,strlen(str));      //讀文件
    close(fd);              //關閉文件 
    printf("%s\n",tmp);

    return 0;
}

打印結果如下:

需要注意的是,tmp數組需要全部初始化爲0,'\0'的ASCII就是0.這樣將打開的文件中讀取的文本信息打印的時候才能正常打印,不會亂碼。否則不知道在哪兒終止,將會產生亂碼。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章