在Linux下,一切皆文件。這是我們嵌入式Linux開發與應用這門課的老師經常掛在嘴邊的一句話。足以體現出在Linux操作系統中,對於一切資源的管理都是對文件的操作。
Linux系統中每一個分區都是一個文件系統,都有自己的目錄層次。Linux會將這些在不同分區的,單獨的文件系統按一定的方式形成一個系統的總目錄層次結構。
Linux下可以通過shell命令來操作文件,但是功能有一定限制;我們也可以通過系統調用或者C語言的庫函數對文件進行操作
-
Linux下的文件主要包括兩方面的數據:文件本身所包含的數據,以及文件屬性,也稱爲元數據。
-
目錄在Linux下也是文件,稱爲目錄文件。目錄文件的內容是該目錄的目錄項,目錄項是該目錄下的文件和目錄相關的信息。每當創建一個新目錄的時候,OS會自動創建兩個目錄項——“.”和“..”
-
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文件分類:
-
普通文件:用戶和OS的數據,程序等信息文件
-
目錄文件:Linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以目錄就是一張表。OS可以修改目錄文件,用戶只能讀目錄文件
-
設備文件:Linux下一切皆文件,設備也是文件。每一種I/O設備對應一個設備文件,存放於/dev下。
-
管道文件:這是Linux用於進程之間通信的文件,一個進程在管道這一段寫入數據,另一個進程在管道的另一端讀取數據。管道文件一般是FIFO文件。
-
鏈接文件:又被稱作符號鏈接文件,它提供了一種共享文件的方式。它包含了指向文件的指針。
通過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.這樣將打開的文件中讀取的文本信息打印的時候才能正常打印,不會亂碼。否則不知道在哪兒終止,將會產生亂碼。