《文件系統(tǒng)實驗報告.doc》由會員分享,可在線閱讀,更多相關(guān)《文件系統(tǒng)實驗報告.doc(15頁珍藏版)》請在裝配圖網(wǎng)上搜索。
實驗二 文件系統(tǒng)
實驗報告
1. 實驗簡介
本實驗要求在假設(shè)的I/O 系統(tǒng)之上開發(fā)一個簡單的文件系統(tǒng),這樣做既能讓實驗者對文件系統(tǒng)有整體了解,又避免了涉及過多細(xì)節(jié)。用戶通過create, open, read 等命令與文件系統(tǒng)交互。文件系統(tǒng)把磁盤視為順序編號的邏輯塊序列,邏輯塊的編號為0 至L-1。I/O 系統(tǒng)利用內(nèi)存中的數(shù)組模擬磁盤。
實際物理磁盤的結(jié)構(gòu)是多維的:有柱面、磁道、扇區(qū)等概念。I/O 系統(tǒng)的任務(wù)是隱藏磁盤的結(jié)構(gòu)細(xì)節(jié),把磁盤以邏輯塊的面目呈現(xiàn)給文件系統(tǒng)。邏輯塊順序編號,編號取值范圍為0 至L .. 1,其中L 表示磁盤的存儲塊總數(shù)。實驗中,我們可以利用字符數(shù)組ldisk[L][B] 構(gòu)建磁盤模型,其中B 表示每個存儲塊的長度。I/O 系統(tǒng)從文件系統(tǒng)接收命令,根據(jù)命令指定的邏輯塊號把磁盤塊的內(nèi)容讀入命令指定的內(nèi)存區(qū)域,或者把命令指定的內(nèi)存區(qū)域內(nèi)容寫入磁盤塊。
我設(shè)計的文件系統(tǒng)擁有三個用戶。
二.具體說明
1.文件系統(tǒng)的組織:磁盤的前k 個塊是保留區(qū),其中包含如下信息:位圖和文件描述符。位圖用來描述磁盤塊的分配情況。位圖中的每一位對應(yīng)一個邏輯塊。創(chuàng)建或者刪除文件,以及文件的長度發(fā)生變化時,文件系統(tǒng)都需要進(jìn)行位圖操作。前k 個塊的剩余部分包含一組文件描述符。每個文件描述符包含如下信息:
? 文件長度,單位字節(jié)
? 文件分配到的磁盤塊號數(shù)組。該數(shù)組的長度是一個系統(tǒng)參數(shù)。在實驗中我們可以把它設(shè)置為一個比較小的數(shù),例如3。
2.目錄:我們的文件系統(tǒng)中僅設(shè)置一個目錄,該目錄包含文件系統(tǒng)中的所有文件。除了不需要顯示地創(chuàng)建和刪除之外,目錄在很多方面和普通文件相像。目錄對應(yīng)0 號文件描述符。初始狀態(tài)下,目錄中沒有文件,所有,目錄對應(yīng)的描述符中記錄的長度應(yīng)為0,而且也沒有分配磁盤塊。每創(chuàng)建一個文件,目錄文件的長度便增加一分。目錄文件的內(nèi)容由一系列的目錄項組成,其中每個目錄項由如下內(nèi)容組成:
? 文件名
? 文件描述符序號
3.對文件的操作:
文件系統(tǒng)需提供如下函數(shù);create, destroy, open, read, write。
? create(filename): 根據(jù)指定的文件名創(chuàng)建新文件。
? destroy(filename): 刪除指定文件。
? open(filename): 打開文件。該函數(shù)返回的索引號可用于后續(xù)的read, write, lseek, 或close 操作。
? close(index): 關(guān)閉制定文件。
? read(index, mem_area, count): 從指定文件順序讀入count 個字節(jié)mem_area 指定的內(nèi)存位置。讀操作從文件的讀寫指針指示的位置開始。
? write(index, mem_area, count): 把mem_area 指定的內(nèi)存位置開始的count 個字節(jié)順序?qū)懭胫付ㄎ募懖僮鲝奈募淖x寫指針指示的位置開始。
? lseek(index, pos): 把文件的讀寫指針移動到pos 指定的位置。pos是一個整數(shù),表示從文件開始位置的偏移量。文件打開時,讀寫指針自動設(shè)置為0。每次讀寫操作之后,它指向最后被訪問的字節(jié)的下一個位置。lseek 能夠在不進(jìn)行讀寫操作的情況下改變讀寫指針能位置。
? directory: 列表顯示所有文件及其長度。
三.實驗過程
創(chuàng)建文件create:
此時顯示文件中的文件:
文件的刪除delete:
打開文件(open):
文件的寫操作(write):
讀文件(read):
關(guān)閉文件(close):
退出系統(tǒng)(exit):
四.實驗代碼
#include
#include
#include
#include
#define NULL 0
typedef struct mdf{//MDF結(jié)構(gòu)體
char username[20];//用戶名
char filename[20];//文件名
struct mdf *next;
}MDF;
typedef struct ufd{//UFD結(jié)構(gòu)體
char filename[20];//文件名
int protect;//文件保護(hù)碼
unsigned int length;//文件長度
struct ufd *next;
}UFD;
typedef struct afd{//AFD結(jié)構(gòu)體
char filename[20];//文件名
int protect;//文件保護(hù)碼
unsigned int point;//文件讀寫指針
struct afd *next;
}AFD;
MDF *pmdf;//全局鏈表頭指針
UFD *pufd;
AFD *pafd;
char UserUFD[20];//已經(jīng)登陸成功的用戶名
void initMDF()//初始化MDF表
{
FILE *fp;
pmdf= (MDF*)malloc(sizeof(MDF));
MDF *p = pmdf;
if((fp = fopen("MDF", "r+")) == NULL){//打開MDF文件
puts("the MDF cannot open!\n");
exit(1);
}
while (!feof(fp)){//把MDF文件中的內(nèi)容裝入鏈表
p->next = (MDF*)malloc(sizeof(MDF));
p = p->next;
fscanf(fp, "%s", p->username);
fscanf(fp, "%s", p->filename);
}
p->next = NULL;
fclose(fp);
}
void printUFD()//打印MDF表
{
UFD *p = pufd->next;
puts("文件名\t\t保護(hù)碼\t\t文件長度\n");
while (p){
printf("%s", p->filename);
printf("\t\t%d" , p->protect);
printf("\t\t%d\n", p->length);
p=p->next;
}
}
void initUFD(char *name)//初始化UFD表
{
FILE *fp;
pufd= (UFD*)malloc(sizeof(UFD));
UFD *p = pufd;
if((fp = fopen(name, "r+")) == NULL){
puts("the UFD cannot open!\n");
exit(1);
}
while (!feof(fp)){//建立UFD鏈表
p->next = (UFD*)malloc(sizeof(UFD));
p = p->next;
fscanf(fp, "%s", p->filename);
fscanf(fp, "%d", &p->protect);
fscanf(fp, "%d", &p->length);
fgetc(fp);
}
p->next = NULL;
fclose(fp);
}
int checkuser()//檢測登陸的用戶名
{
char username[20];
while(1){
puts("請輸入用戶名: \n");
scanf("%s", username);
MDF *p = pmdf;
while(p){
if(strcmp(username, p->username) == 0){
strcpy(UserUFD, p->filename);
initUFD(p->filename);
printUFD();
return 1;
}
p= p->next;
}
puts("同戶名不存在\n");
}
}
void initAFD()//初始化AFD
{
pafd = (AFD*)malloc(sizeof(AFD));
pafd->next = NULL;
}
bool create()//創(chuàng)建文件命令
{
char filename[20];
UFD *p = pufd->next;
AFD *pa = pafd;
puts("請輸入要創(chuàng)建的文件名: \n");
scanf("%s", filename);
while (p){
if(strcmp(filename, p->filename) == 0){
puts("此文件已經(jīng)存在了!\n");
return 0;
}
if(!p->next)
break;
p= p->next;
}
p->next = (UFD*)malloc(sizeof(UFD));
p=p->next;
strcpy(p->filename, filename);
p->protect = 2;
p->length = 0;
p->next = NULL;
while(pa->next){//創(chuàng)建文件后加入到AFD
pa=pa->next;
}
pa->next = (AFD*)malloc(sizeof(AFD));
pa = pa->next;
strcpy(pa->filename ,filename);
pa->protect = 2;
pa->point = 0;
pa->next = NULL;
return 1;
}
bool _delete()//刪除文件命令
{
char filename[20];
puts("請輸入要刪除的文件名: \n");
scanf("%s", filename);
UFD *p = pufd;
UFD *temp;
while (p->next){
if(strcmp(filename, p->next->filename) == 0){
temp = p->next;
p->next = p->next->next;
free(temp);
printf("文件%s刪除成功!\n", filename);
return 1;
}
p= p->next;
}
puts("要刪除的文件不存在!\n");
return 0;
}
bool open()//打開文件命令
{
char filename[20];
unsigned int protect;
puts("請輸入要打開的文件名: \n");
scanf("%s", filename);
puts("請輸入要打開的文件保護(hù)類型: \n");
scanf("%d", &protect);
UFD *p = pufd->next;
AFD *pa = pafd->next;
while (pa){
if(strcmp(filename, pa->filename) == 0){
printf("文件%s已經(jīng)打開!\n",filename);
return 1;
}
if(!pa->next)
break;
pa = pa->next;
}
if(!pa)
pa=pafd;
while (p){
if(strcmp(filename, p->filename) == 0){
pa->next = (AFD*)malloc(sizeof(AFD));
pa = pa->next;
strcpy(pa->filename , p->filename);
pa->protect = protect;
if(protect == 1)
pa->point = 0;
else
pa->point = p->length;
pa->next=NULL;
printf("文件%s已經(jīng)打開!\n",filename);
return 1;
}
p= p->next;
}
puts("要打開的文件不存在!\n");
return 0;
}
void close()//關(guān)閉文件命令
{
char filename[20];
UFD *pu = pufd->next;
puts("請輸入要關(guān)閉的文件名: \n");
scanf("%s", filename);
AFD *p = pafd;
AFD *temp;
while (p&&p->next){
if(strcmp(filename, p->next->filename) == 0){
temp = p->next;
p->next = p->next->next;
if(temp->protect == 2){
while(pu){
if(strcmp(temp->filename, pu->filename) == 0){
pu->length =temp->point;
break;
}
pu = pu->next;
}
}
free(temp);
printf("文件%s關(guān)閉成功!\n", filename);
return ;
}
p= p->next;
}
puts("要關(guān)閉的文件沒有被打開!\n");
}
int read()//讀文件命令
{
char filename[20];
unsigned int length;
AFD *p = pafd->next;
puts("請輸入要讀的文件名: \n");
scanf("%s", filename);
puts("請輸入要讀的長度\n");
scanf("%d", &length);
while (p){
if(strcmp(filename, p->filename) == 0){
p->point += length;
printf("文件%s讀取成功!\n", filename);
return 1;
}
p= p->next;
}
puts("讀取失敗文件沒有打開過!\n");
return 0;
}
int write()//寫文件命令
{
char filename[20];
unsigned int length;
AFD *p = pafd->next;
puts("請輸入要寫的文件名: \n");
scanf("%s", filename);
while (p){
if(strcmp(filename, p->filename) == 0){
if(p->protect != 2){
printf("文件%s不可寫!\n", filename);
return 0;
}
puts("請輸入要寫的長度\n");
scanf("%d", &length);
p->point += length;
printf("文件%s寫入成功!\n", filename);
return 1;
}
p= p->next;
}
puts("寫入失敗文件沒有打開過!\n");
return 0;
}
void destroy()//釋放內(nèi)存
{
MDF *pm = pmdf;
while(pm){
pmdf = pmdf->next;
free(pm);
pm = pmdf;
}
AFD *pa = pafd;
while(pa){
pafd = pafd->next;
free(pa);
pa = pafd;
}
UFD *pu = pufd;
while(pu){
pufd = pufd ->next;
free(pu);
pu = pufd;
}
}
void saveUFD()//保存UFD文件
{
FILE *fp;
UFD *p = pufd->next;
if((fp = fopen(UserUFD, "w")) == NULL){
puts("the UFD cannot open!\n");
exit(1);
}
while (p){
fprintf(fp, "%s", "\n");
fprintf(fp, "%s%s", p->filename,"\t\t");
fprintf(fp, "%d%s", p->protect,"\t\t");
fprintf(fp, "%d", p->length);
p=p->next;
}
fclose(fp);
}
void exit()//推出系統(tǒng)
{
AFD *pa = pafd->next;
UFD *pu = pufd->next;
while(pa){
if(pa->protect == 2){
while(pu){
if(strcmp(pa->filename, pu->filename) == 0){
pu->length = pa->point;
break;
}
pu = pu->next;
}
}
pa =pa->next;
}
saveUFD();
printUFD();
destroy();
}
void operate()//命令識別
{
while(1){
char command[20];
char name[][8] = {"create", "delete", "open", "close","read", "write","exit"};
puts("請輸入命令: \n");
scanf("%s", command);
if(strcmp(command, name[0] ) == 0)
create();
else if(strcmp(command, name[1] ) == 0)
_delete();
else if(strcmp(command, name[2] ) == 0)
open();
else if(strcmp(command, name[3] ) == 0)
close();
else if(strcmp(command, name[4] ) == 0)
read();
else if(strcmp(command, name[5] ) == 0)
write();
else if(strcmp(command, name[6] ) == 0){
exit();
return;
}else
puts("無效命令,請重新輸入:\n");
}
}
void print()
{
puts("文件系統(tǒng)\n");
puts("***使用說明***:\n");
puts("本文件系統(tǒng)共有三個用戶分別是user1 user2 user3\n\
系統(tǒng)命令有create, delete, open, close,read, write,exit\
\nexit----------------------------------------退出系統(tǒng)");
}
int main()
{
print();
initMDF();
checkuser();
initAFD();
operate();//命令識別
return 0;
}
鏈接地址:http://m.zhongcaozhi.com.cn/p-9135965.html