一. 實驗目的
- 熟悉Linux檔案系統的檔案和目錄結構,掌握Linux檔案系統的基本特征;
- 模拟實作Linux檔案系統的簡單I/O流操作:備份檔案。
二. 實驗内容
- 浏覽Linux系統根目錄下的子目錄,熟悉每個目錄的檔案和功能;
- 設計程式模拟實作Linux檔案系統的簡單I/O流操作:備份檔案。
三. 實驗原理
- Linux各種發行版的目錄結構基本一緻,各個目錄簡單介紹如下:
目錄 描述
/ 根目錄
/bin 做為基礎系統所需要的最基礎的指令就是放在這裡。比如 ls、cp、mkdir等指令;功能和/usr/bin類似,這個目錄中的檔案都是可執行的,普通使用者都可以使用的指令。
/boot Linux的核心及引導系統程式所需要的檔案,比如 vmlinuz initrd.img 檔案都位于這個目錄中。在一般情況下,GRUB或LILO系統引導管理器也位于這個目錄;啟動裝載檔案存放位置,如kernels,initrd,grub。一般是一個獨立的分區。
/dev 一些必要的裝置,聲霸卡、磁盤等。還有如 /dev/null. /dev/console /dev/zero /dev/full 等。
/etc 系統的配置檔案存放地. 一些伺服器的配置檔案也在這裡;比如使用者帳号及密碼配置檔案;
/etc/opt:/opt對應的配置檔案
/etc/X11:Xwindows系統配置檔案
/etc/xml:XML配置檔案
……
/home 使用者工作目錄,和個人配置檔案,如個人環境變量等,所有的賬号配置設定一個工作目錄。一般是一個獨立的分區。
/lib 庫檔案存放地。bin和sbin需要的庫檔案。類似windows的DLL。
/media 可拆卸的媒介挂載點,如CD-ROMs、移動硬碟、U盤,系統預設會挂載到這裡來。
/mnt 臨時挂載檔案系統。這個目錄一般是用于存放挂載儲存裝置的挂載目錄的,比如有cdrom 等目錄。可以參看/etc/fstab的定義。
/opt 可選的應用程式包。
/proc 作業系統運作時,程序(正在運作中的程式)資訊及核心資訊(比如cpu、硬碟分區、記憶體資訊等)存放在這裡。/proc目錄僞裝的檔案系統proc的挂載目錄,proc并不是真正的檔案系統,它的定義可以參見 /etc/fstab 。
/root Root使用者的工作目錄
/sbin 和bin類似,是一些可執行檔案,不過不是所有使用者都需要的,一般是系統管理所需要使用得到的。
/tmp 系統的臨時檔案,一般系統重新開機不會被儲存。
/usr 包含了系統使用者工具和程式。
/usr/bin:非必須的普通使用者可執行指令
/usr/include:标準頭檔案
/usr/lib:/usr/bin/ 和 /usr/sbin/的庫檔案
/usr/sbin:非必須的可執行檔案
/usr/src:核心源碼
/usr/X11R6:X Window System, Version 11, Release 6.
/srv 該目錄存放一些服務啟動之後需要提取的資料
2. Linux的檔案結構是單個的樹狀結構.可以用tree進行展示。檔案操作指令見附錄1,
3. Linux檔案系統:Linux 中允許衆多不同的檔案系統共存,如 ext2, ext3, vfat 等。通過使用同一套檔案 I/O 系統 調用即可對 Linux 中的任意檔案進行操作而無需考慮其所在的具體檔案系統格式;更進一步,對檔案的 操作可以跨檔案系統而執行。“一切皆是檔案”是 Unix/Linux 的基本哲學之一。不僅普通的檔案,目錄、字元裝置、塊裝置、 套接字等在 Unix/Linux 中都是以檔案被對待;它們雖然類型不同,但是對其提供的卻是同一套操作界面。
4. 虛拟檔案系統(Virtual File System, 簡稱 VFS), 是 Linux 核心中的一個軟體層,用于給使用者空間的程式提供檔案系統接口;同時,它也提供了核心中的一個 抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 VFS 共存,而且也依靠 VFS 協同工作。為了能夠支援各種實際檔案系統,VFS 定義了所有檔案系統都支援的基本的、概念上的接口和資料 結構;同時實際檔案系統也提供 VFS 所期望的抽象接口和資料結構,将自身的諸如檔案、目錄等概念在形式 上與VFS的定義保持一緻。換句話說,一個實際的檔案系統想要被 Linux 支援,就必須提供一個符合VFS标準 的接口,才能與 VFS 協同工作。實際檔案系統在統一的接口和資料結構下隐藏了具體的實作細節,是以在VFS 層和核心的其他部分看來,所有檔案系統都是相同的。
5、利用C庫函數fopen(), fread(), fwrite(), fclose() 來實作簡單的檔案備份, 即将一個檔案的内容拷貝到另一個檔案中去。
四. 實驗中用到的系統調用函數
實驗隻是模拟實作檔案的備份功能,不需要系統調用函數。
五、備份檔案的過程圖

六、源代碼
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
FILE *fp2;
char *buf;
fp=fopen("shuju.txt","r"); //以隻讀方式打開要備份的檔案
if(fp==NULL)
{
printf("打開檔案失敗\n");
exit(1);
}
fp2=fopen("beifen.txt","w"); //打開隻寫檔案用來備份,若檔案不存在則建立該檔案
if(fp2==NULL)
{
printf("打開檔案失敗\n");
exit(1);
}
buf=(char*)malloc(sizeof(char)*1024); //配置設定空間
int count=fread(buf,sizeof(char),1024,fp); //讀檔案,用count記錄讀取的字元個數
fwrite(buf,sizeof(char),count,fp2); //寫入備份檔案
fclose(fp); //關閉檔案
fclose(fp2);
}
七、實驗結果及分析
以隻讀方式打開要備份的檔案shuju.txt,建立檔案beifen.txt用來備份,将資料從shuju.txt中讀出,再寫入備份檔案beifen.txt。結果如圖所示,成功完成了備份。
八、思考題
1、使用系統調用函數open(),read(),write(),close()實作簡單檔案備份的原理是什麼?
這些系統調用函數是通過檔案描述符來實作檔案的備份的,系統調用 open()作用是建立一個新的檔案描述符。open 建立了一條到檔案或裝置的通路路徑。如果調用成功,它将傳回一個可以被 read、write 和其他系統調用使用的檔案描述符。系統調用 read()的作用是:從檔案描述符相關聯的檔案裡讀入 n bytes個位元組的資料,并把它們放到資料區buf中。系統調用 write()的作用是把緩沖區 buf 的前n bytes 個位元組寫入與檔案描述符關聯的檔案中,傳回實際寫入的位元組數。系統調用 close()可以用來終止檔案描述符與其對應檔案之間的關聯。
2、使用C庫函數fopen(), fread(), fwrite(), fclose() 來實作簡單檔案備份的原理是什麼?
使用C庫函數fopen()打開一個檔案資料流,調用fopen()會傳回一個FILE結構指針,fread(),fwrite()運用FILE指針對檔案流進行操作,fclose()關閉建立的流。使用C庫函數實作檔案備份實際上是建立兩個檔案流,把其中一個流中的資料寫入另一個流中。
3、上述二者的差別在哪裡?
這些函數都是對檔案操作的相關函數,調用C庫函數是在使用者态下執行,建立在資料流的基礎上,而系統調用在核心模式中運作,建立在檔案描述符的基礎上。庫函數調用與使用者程式相關聯,但系統調用是作業系統的一個進入點。在使用C庫函數對檔案操作時,相應的操作會在進入核心中以相應系統調用函數實作。