




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實驗5Linux文件管理一、實驗目的1.掌握Linux文件系統(tǒng)的基本原理、結構和實現(xiàn)方法2.掌握Linux文件系統(tǒng)中文件的建立、打開、讀/寫、執(zhí)行、屬性等系統(tǒng)調(diào)用的使用3.學會設計簡單的文件系統(tǒng)并實現(xiàn)一組操作4.通過實驗學習文件系統(tǒng)的系統(tǒng)調(diào)用命令,提高對文件系統(tǒng)實現(xiàn)功能的理解和掌握二、實驗內(nèi)容設計并實現(xiàn)一個一級文件系統(tǒng)程序,要求實現(xiàn)以下功能:1.提供文件創(chuàng)建/刪除接口命令create / delete、目錄創(chuàng)建/刪除接口命令mkdir / rmdir、顯示目錄內(nèi)容命令ls等。2.創(chuàng)建的文件不要求格式和內(nèi)容。三、實驗結果1.程序源代碼main.cpp#include <stdio.h>
2、;#include <malloc.h>#include <stdlib.h>#include <string.h>#include "structure.h"#include "creat.h"#include "access.h"#include "ballfre.h"#include "close.h"#include "delete.h"#include "dir.h"#include "format.
3、h"#include "halt.h"#include "iallfre.h"#include "install.h"#include "log.h"#include "name.h"#include "open.h"#include "rdwt.h"#include "igetput.h"struct hinode hinodeNHINO;struct dir dir;struct file sys_ofileSYSOPEN
4、FILE;struct filsys filsys;struct pwd pwdPWDNUM;struct user userUSERNUM;FILE *fd;struct inode *cur_path_inode;int user_id;/*kkkkk*/unsigned short usr_id;char usr_p12;char sel;char temp_dir12;main() unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4,i,j; char *buf; int done=1; printf("nDo you want to for
5、mat the disk(y or n)?n"); if(getchar()='y') printf("nFormat will erase all context on the disk n"); printf("Formating.n"); format(); printf("nNow will install the fillsystem,please wait.n"); install(); printf("n-Login-nPlease input your userid:");
6、 scanf("%u",&usr_id); printf("nPlease input your password:"); scanf("%s",&usr_p); /* printf("nsuccessn");*/ if(!login(usr_id,usr_p) return; while(done) printf("n Please Select Your Operatingn"); printf(" -1-lsn -2-mkdirn -3-change dirn -
7、4-create filen -0-Logoutn");/* */ sel=getchar(); sel=getchar(); switch(sel) case '1': _dir(); break; case '2': printf("please input dir name:"); scanf("%s",temp_dir); mkdir(temp_dir); break; case '3': printf("please input dir name:"); scanf(
8、"%s",temp_dir); chdir(temp_dir); break; case '4': printf("please input file name:"); scanf("%s",temp_dir); ab_fd1=creat(2118,temp_dir,01777); buf=(char *)malloc(BLOCKSIZ*6+5); write(ab_fd1,buf,BLOCKSIZ*6+5); close(0,ab_fd1); free(buf); break; case '0': l
9、ogout(usr_id); halt(); done = 0; default: printf("error!nNo such command,please try again.nOr you can ask your teacher for help.n"); break; else printf("User canselednGood Byen");structure.h#ifndef _STRUCTURE_H#define _STRUCTURE_H#define MAX 32767#define BLOCKSIZ 512#define SYSOP
10、ENFILE 40#define DIRNUM 128#define DIRSIZ 14#define PWDSIZ 12#define PWDNUM 32#define NOFILE 20#define NADDR 10#define NHINO 128#define USERNUM 10#define DINODESIZ 72#define DINODEBLK 32#define FILEBLK 512#define NICFREE 50#define NICINOD 50#define DINODESTART 1024#define DATASTART (2+DINODEBLK)*BLO
11、CKSIZ#define DIEMPTY00000#define DIFILE01000#define DIDIR02000#define UDIREAD00001#define UDIWRITE00002#define UDIEXICUTE00004#define GDIREAD00010#define GDIWRITE00020#define GDIEXICUTE00040#define ODIREAD00100#defineODIWRITE00200#define ODIEXICUTE00400#define READ1#define WRITE2#defineEXICUTE3#defi
12、ne DEFAULTMODE 00777#define IUPDATE00002#defineSUPDATE00001#define FREAD00001#define FWRITE 00002#define FAPPEND 00004#define DISKFULL 65535#define SEEK_SET 0struct inode struct inode *i_forw; struct inode *i_back; char i_flag; unsigned int i_ino; unsigned int i_count; unsigned int di_addrNADDR; uns
13、igned short di_number; unsigned short di_mode; unsigned short di_uid; unsigned short di_gid; unsigned short di_size;struct dinode unsigned short di_number; unsigned short di_mode; unsigned short di_uid; unsigned short di_gid; unsigned long di_size; unsigned int di_addrNADDR;struct direct char d_name
14、DIRSIZ; unsigned int d_ino;struct filsys unsigned short s_isize; unsigned long s_fsize; unsigned int s_nfree; unsigned short s_pfree; unsigned int s_freeNICFREE; unsigned int s_ninode; unsigned short s_pinode; unsigned int s_inodeNICINOD; unsigned int s_rinode; char s_fmod;struct pwd unsigned short
15、p_uid; unsigned short p_gid; char passwordPWDSIZ;struct dir struct direct directDIRNUM; int size;struct hinode struct inode *i_forw;struct file char f_flag; unsigned int f_count; struct inode *f_inode; unsigned long f_off;struct user unsigned short u_default_mode; unsigned short u_uid; unsigned shor
16、t u_gid; unsigned short u_ofileNOFILE;extern struct inode* aaa;extern struct hinode hinodeNHINO;extern struct dir dir;extern struct file sys_ofileSYSOPENFILE;extern struct filsys filsys;extern struct pwd pwdPWDNUM;extern struct user userUSERNUM;extern struct inode *cur_path_inode;extern FILE *fd;ext
17、ern int user_id;extern struct inode *iget();extern iput();extern unsigned int balloc();extern bfree();extern struct inode *ialloc();extern ifree();extern int namei();extern short iname();extern unsigned int access();extern _dir();extern mkdir();extern chdir();extern unsigned short open();extern crea
18、te();extern unsigned int read();extern unsigned int write();extern int login();extern logout();extern install();extern format();extern close();extern halt();#endifaccess.h#include <stdio.h>#include "structure.h"unsigned int access(user_id,inode,mode)unsigned int user_id;struct inode
19、*inode;unsigned short mode; switch(mode) case READ: if(inode->di_mode&ODIREAD) return 1; if(inode->di_mode&GDIREAD)&& (useruser_id.u_gid=inode->di_gid) return 1; if(inode->di_mode&UDIREAD)&& (useruser_id.u_uid=inode->di_uid) return 1; return 0; case WRITE:
20、if(inode->di_mode&ODIWRITE) return 1; if(inode->di_mode&GDIWRITE)&& (useruser_id.u_gid=inode->di_gid) return 1; if(inode->di_mode&UDIWRITE)&& (useruser_id.u_uid=inode->di_uid) return 1; return 0; case EXICUTE: if(inode->di_mode&ODIEXICUTE) return 1;
21、if(inode->di_mode&GDIEXICUTE)&& (useruser_id.u_gid=inode->di_gid) return 1; if(inode->di_mode&UDIEXICUTE)&& (useruser_id.u_uid=inode->di_uid) return 1; return 0; default: return 1; ballfre.h#include <stdio.h>#include "structure.h"static unsigned in
22、t block_bufBLOCKSIZ/sizeof(int);unsigned int balloc() unsigned int free_block; int i,flag; if(filsys.s_nfree=0) printf("nDisk Full!n"); return DISKFULL; i=filsys.s_pfree; flag=(i=0); if(flag) /該BLOCK組全部用了 fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_freeNICFREE-1+1),SEEK_SET); /filsys.s_freeNICFR
23、EE-1+1指向下一個block組的地址塊 fread(block_buf,1,BLOCKSIZ,fd); for(i=0; i<NICFREE; i+) filsys.s_freei=block_bufi; /將待用block組的地址讀入超級塊 filsys.s_pfree=NICFREE-1; free_block=filsys.s_freefilsys.s_pfree; else free_block=filsys.s_freefilsys.s_pfree; filsys.s_pfree-; filsys.s_nfree-; filsys.s_fmod=SUPDATE; retur
24、n free_block;bfree (unsigned int block_num) int i; if(filsys.s_pfree=NICFREE-1) /表示回收的block已經(jīng)可以組成一個block組了 for(i=0; i<NICFREE; i+) block_bufi=filsys.s_freeNICFREE-1-i; filsys.s_pfree=0; fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_free0),SEEK_SET); /filsys.s_free0為當前BLOCK組的地址塊 fwrite(block_buf,1,BLOCKSI
25、Z,fd); else filsys.s_pfree+; filsys.s_nfree+; filsys.s_fmod=SUPDATE;close.h#include <stdio.h>#include "structure.h"close(user_id,cfd)unsigned int user_id;unsigned short cfd; struct inode *inode; inode=sys_ofileuseruser_id.u_ofilecfd.f_inode; iput(inode); sys_ofileuseruser_id.u_ofilec
26、fd.f_count-; useruser_id.u_ofilecfd=SYSOPENFILE+1;creat.hcreat(uid,filename,mode)unsigned int uid;char *filename;unsigned short mode; int di_ith,di_ino; struct inode *inode; int i,j; i=0; while(i<USERNUM)/user的值由函數(shù)login()注冊,參看文件log.h if(useri.u_uid=uid) user_id=i; break; i+; if(i=USERNUM) printf(
27、"the user id is wrong.n"); exit(1); di_ino=namei(filename); if(di_ino!=-1)/文件已經(jīng)存在 inode=iget(di_ino); if(access(user_id,inode,mode)=0) iput(inode); printf("ncreat access not allowedn"); return 0; for(i=0; i<inode->di_size/BLOCKSIZ+1; i+) bfree(inode->di_addri); for(i=0;
28、i<SYSOPENFILE; i+) if(sys_ofilei.f_inode=inode) sys_ofilei.f_off=0; for(i=0; i<NOFILE; i+) if(useruser_id.u_ofilei=SYSOPENFILE+1) useruser_id.u_uid=inode->di_uid; useruser_id.u_gid=inode->di_gid; for(j=0; j<SYSOPENFILE; i+) if(sys_ofilej.f_count=0) useruser_id.u_ofilei=j; sys_ofilej.f
29、_flag=(char)mode; return i; else inode=ialloc(); di_ith=iname(filename); dir.size+; dir.directdi_ith.d_ino=inode->i_ino; inode->di_mode=useruser_id.u_default_mode; inode->di_uid=useruser_id.u_uid; inode->di_gid=useruser_id.u_gid; inode->di_size=0; inode->di_number=0; for(i=0; i<
30、SYSOPENFILE; i+) if(sys_ofilei.f_count=0) break; for(j=0; j<NOFILE; i+) if(useruser_id.u_ofilej=SYSOPENFILE+1) break; useruser_id.u_ofilej=i; sys_ofilei.f_flag=(char)mode; sys_ofilei.f_count=0; sys_ofilei.f_off=0; sys_ofilei.f_inode=inode; return j; return 0;delete.h#include <stdio.h>#inclu
31、de "structure.h"delete(char *filename)unsigned int dinodeid;struct inode *inode;dinodeid=namei(filename);if(dinodeid!=(int)NULL)inode=iget(dinodeid);inode->di_number-;iput(inode);dir.h_dir()unsigned int di_mode;int i,j,one;struct inode *temp_inode;printf("CURRENT DIRECTORY:n")
32、;for(i=0;i<dir.size;i+)if(dir.directi.d_ino!=DIEMPTY)printf("%sDIRSIZ",dir.directi.d_name);temp_inode=iget(dir.directi.d_ino);di_mode=temp_inode->di_mode;for(j=0;j<9;j+)one=di_mode%2;di_mode=di_mode/2;if(one) printf("x");else printf("-");if(temp_inode->di_mo
33、de&&DIFILE=1)printf("%ldn",temp_inode->di_size);printf("block chain:");for(i=0;i<temp_inode->di_size/BLOCKSIZ+1;i+)printf("%4d",temp_inode->di_addri);printf("n");else printf("<dir>n");iput(temp_inode);mkdir(char *dirname)int
34、 dirid,dirpos;struct inode *inode;struct direct bufBLOCKSIZ/(DIRSIZ+2);unsigned int block;dirid=namei(dirname);if(dirid!=-1)/dirid=-1表示沒有該目錄名存在;inode=iget(dirid);if(inode->di_mode&DIDIR)printf("n%s directory already existed!n");elseprintf("n%s is a file name&can not creat a
35、 dir the same name",dirname);iput(inode);return 0;dirpos=iname(dirname);inode=ialloc();inode->i_ino=dirpos;dir.directdirpos.d_ino=inode->i_ino;dir.size+;strcpy(buf0.d_name,".");buf0.d_ino=dirid;strcpy(buf1.d_name,".");buf1.d_ino=cur_path_inode->i_ino;block=balloc();
36、fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);fwrite(buf,1,BLOCKSIZ,fd);inode->di_size=2*(DIRSIZ+2);inode->di_number=1;inode->di_mode=useruser_id.u_default_mode;inode->di_uid=useruser_id.u_uid;inode->di_gid=useruser_id.u_gid;inode->di_addr0=block;iput(inode);return 0;chdir(char *dirn
37、ame)int dirid;int temp;struct inode *inode;short block;int i,j,low=0,high=0;dirid=namei(dirname);if(dirid=#include <stdio.h>#include "structure.h"delete(char *filename)unsigned int dinodeid;struct inode *inode;dinodeid=namei(filename);if(dinodeid!=(int)NULL)inode=iget(dinodeid);inode
38、->di_number-;iput(inode);=-1)printf("n%s does not existedn",dirname);return 0;inode=iget(dirid);if(!access(user_id,inode,useruser_id.u_default_mode)printf("nhas not access to the directory %s",dirname);iput(inode);return 0;for(i=0;i<dir.size;i+)for(j=0;j<DIRNUM;j+)temp=d
39、ir.directj.d_ino;if(dir.directj.d_ino=0|dir.directj.d_ino>MAX) break;dir.directj.d_ino=0;for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+1;i+)bfree(cur_path_inode->di_addri);i=dir.size;for(i=0;i<dir.size;i+=BLOCKSIZ/(DIRSIZ+2)block=balloc();cur_path_inode->di_addri=block;fseek(fd,DATAST
40、ART+block*BLOCKSIZ,SEEK_SET);fwrite(&dir.directi,1,BLOCKSIZ,fd);cur_path_inode->di_size=dir.size*(DIRSIZ+2);iput(cur_path_inode);cur_path_inode=inode;i=inode->di_size/BLOCKSIZ+1;j=0;for(i=0;i<inode->di_size/BLOCKSIZ+1;i+)fseek(fd,DATASTART+inode->di_addri*BLOCKSIZ,SEEK_SET);fread(
41、&dir.directj,1,BLOCKSIZ,fd);j+=BLOCKSIZ/(DIRSIZ+2);return 0;format.hformat() struct inode *inode;struct direct dir_bufBLOCKSIZ/(DIRSIZ+2);struct pwd passwdBLOCKSIZ/(PWDSIZ+4);struct filsys filsys;unsigned int block_bufBLOCKSIZ/sizeof(int);char *buf;char *empty;int i,j,k;fd=fopen("filesystem
42、","w+b");buf=(char*)malloc(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char);if(fd=NULL)printf("nfile system file creat failed!n");exit(0);fseek(fd,0,SEEK_SET);fwrite(buf,1,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd);free(buf);passwd0.p_uid=2116;passwd0.p_gid=03;strcpy(passwd0.
43、password,"don1");passwd1.p_uid=2117;passwd1.p_gid=03;strcpy(passwd1.password,"don2");passwd2.p_uid=2118;passwd2.p_gid=04;strcpy(passwd2.password,"abcd");passwd3.p_uid=2119;passwd3.p_gid=04;strcpy(passwd3.password,"don4");passwd4.p_uid=2220;passwd4.p_gid=05;str
44、cpy(passwd4.password,"don5");inode=iget(0);inode->di_mode=DIEMPTY;iput(inode);inode=iget(1);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIDIR;inode->di_size=3*(DIRSIZ+2);inode->di_addr0=0;strcpy(dir_buf0.d_name,".");dir_buf0.d_ino=1;strcpy(dir_buf1.d_name,".
45、");dir_buf1.d_ino=1;strcpy(dir_buf2.d_name,"etc");dir_buf2.d_ino=2;fseek(fd,DATASTART,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2),fd);iput(inode);fseek(fd,1056,SEEK_SET);fread(inode,DINODESIZ,1,fd);inode=iget(1);iput(inode);inode=iget(2);inode->di_number=1;inode->di_mode=DEFAULTMODE
46、|DIDIR;inode->di_size=3*(DIRSIZ+2);inode->di_addr0=1;strcpy(dir_buf0.d_name,".");dir_buf0.d_ino=1;strcpy(dir_buf1.d_name,".");dir_buf1.d_ino=2;strcpy(dir_buf2.d_name,"password");dir_buf2.d_ino=3;fseek(fd,DATASTART+BLOCKSIZ*1,SEEK_SET);fwrite(dir_buf,1,3*(DIRSIZ+2)
47、,fd);iput(inode);inode=iget(3);inode->di_number=1;inode->di_mode=DEFAULTMODE|DIFILE;inode->di_size=BLOCKSIZ;inode->di_addr0=2;for(i=5;i<PWDNUM;i+)passwdi.p_uid=0;passwdi.p_gid=0;strcpy(passwdi.password," ");fseek(fd,DATASTART+2*BLOCKSIZ,SEEK_SET);fwrite(passwd,1,BLOCKSIZ,fd)
48、;iput(inode);filsys.s_isize=DINODEBLK;filsys.s_fsize=FILEBLK;filsys.s_ninode=DINODEBLK*BLOCKSIZ/DINODESIZ-4;filsys.s_nfree=FILEBLK-3;for(i=0;i<NICINOD;i+)filsys.s_inodei=4+i;filsys.s_pinode=0;filsys.s_rinode=NICINOD+4;for(i=NICFREE+2;i<FILEBLK;i+=50)/為何要加2,參看149行的注釋for(j=0;j<NICFREE;j+)block_bufNICFREE-1-j=i-j;fseek(fd,DATASTART+BLOCKSIZ*(i-49),SEEK_SET);fwrite(block_buf,1,BLOCKSIZ,fd);/當i=502之后,完成文件塊502453的寫入; /之后文件塊512503不能進行,需要特殊處理for(i=503;i<512;i+)block_bufi-503=i;fseek(fd,DATASTART+BLOCKSIZ*503,SEEK_SET);fwrite(block_buf,1,BLOCKS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年茶藝師中級茶葉加工與儲藏技能鑒定理論試卷
- 2025電工(中級)職業(yè)技能鑒定實操試卷:實操技能與電氣智能穿戴
- 2025年消防安全知識培訓考試題庫基礎篇火災預防與控制試題
- 秋游經(jīng)歷分享記事作文(11篇)
- 2025年能源與資源行業(yè):能源行業(yè)產(chǎn)業(yè)鏈上下游協(xié)同發(fā)展研究報告
- 第21課 世界殖民體系的瓦解與新興國家的發(fā)展 教學課件 高中歷史統(tǒng)編版必修中外歷史綱要下
- 夏天的陽光和雨露抒情作文11篇
- 2025年腦疝診斷試題
- 工業(yè)領域CCS技術應用案例推動化妝品行業(yè)低碳轉(zhuǎn)型
- 數(shù)字貨幣在2025年金融市場國際化進程中的機遇與挑戰(zhàn)報告
- 產(chǎn)業(yè)命題賽道命題解決對策參考模板
- 985、211和雙一流大學名單
- 云南省昆明市官渡區(qū)2022-2023學年七年級下學期期末語文試題(含答案)
- 三人合伙經(jīng)營協(xié)議書電子版(2篇)
- 汽車產(chǎn)品認證
- 管道護理業(yè)務學習課件
- 新求精德語強化教程初級1(第四版)
- 蛇類解剖生理特征(特種寵物疾病防治)
- 高中日語學習宣講+課件
- 年產(chǎn)10噸功能益生菌凍干粉的工廠設計改
- 國家開放大學《高等數(shù)學基礎》形考任務1-4參考答案
評論
0/150
提交評論