實驗5 Linux文件管理_第1頁
實驗5 Linux文件管理_第2頁
實驗5 Linux文件管理_第3頁
實驗5 Linux文件管理_第4頁
實驗5 Linux文件管理_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論