实验5-Linux文件管理_第1页
实验5-Linux文件管理_第2页
实验5-Linux文件管理_第3页
实验5-Linux文件管理_第4页
实验5-Linux文件管理_第5页
已阅读5页,还剩21页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验5Linux文件管理

一、实验目的

1.掌握Linux文件系统的根本原理、结构和实现方法

2.掌握Linux文件系统中文件的建立、翻开、读/写、执行、属性等系统调用的使用

3.学会设计简单的文件系统并实现一组操作

4.通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握

二、实验内容

设计并实现一个一级文件系统程序,要求实现以下功能:

1.提供文件创立/删除接口命令create/delete、目录创立/删除接口命令mkdir/rmdir、显示目录h)

容命令Is等C

2.创立的文件不要求格式和内容。

三、实验结果

1.程序源代码

main.cpp

#include<stdio.h>

#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"

ftinclude"format.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"

structhinodehinode[NHINO];

structdirdir;

structfilesys_ofile[SYSOPENFILE];

structfilsysfilsys;

structpwdpwd(PWDNUM);

structuseruser[USERNUM];

FILE*fd;

structinode*cur_path_inod°;

intuserjd;

/♦kkkkk*/

unsignedshortusrjd;

charusr_p[12];

charsei;

chartemp_dir[12];

main()

(

unsignedshortab_fdl,ab_fd2,ab_fd3,ab_fd4,ij;

char*buf;

intdone=l;

printf("\nDoyouwanttoformatthedisk(yorn)?\n");

if(getchar{)=='y')

(

printf("\nFormatwilleraseallcontextonthedisk\n").

printf("Formating...\n");

format();

printf("\nNowwillinstallthefillsystem,pleasewait...\n");

install();

printf("\n-"Login-\nPleaseinputyouruserid:");

scanf("%u",&usr_id);

printf("\nPleaseinputyourpassword:");

scanf("%s",&usr_p);

/+prlntf("\nsuccess\n");*/

if(!login(usr_id,usr_p))

return;

while(done)

printf("\nPleaseSelectYourOperating\n");

printf("-1--lS\n-2--mkdir\n-3—-changedir\n-4—-createfile\n-0--Logout\n");/*

3T>BT*/

sel=getchar();

sel=getchar();

switch(sel)

case'1':

_dir();

break;

case'2':

printf("pleaseinputdirname:");

scanf("%s",temp_dir);

mkdir(temp_dir);

break;

case3:

printf("pleaseinputdirname:");

scanf("%s"/temp_dir);

chdir(temp_dir);

break;

case'4':

printf("peaseinputfilename:");

scanf("%s",temp_dir);

ab_fdl=creat(211.8,temp_dir,01777);

buf=(char*)malloc(BLOCKSIZ*6+5);

write(ab_fdl,buf,BLOCKSIZ*6+5);

close(0,ab_fdl);

free(buf);

break;

case'O':

logout(usrjd);

halt();

done=0:

default:

printf("error!\nNosuchcommand,pleasetryagain.\nOryoucanaskyour

teacherforhelp.\n");

break;

)

}

)

else

prlntf("Usercanseled\nGoodBye\n");

)

structure.h

#ifndef_STRUCTURE_H

#define_STRUCTURE_H

#defineMAX32767

#defineBLOCKSIZ512

#defineSYSOPENFILE40

#defineDIRNUM128

#defineDIRSIZ14

#definePWDSIZ12

#definePWDNUM32

#defineNOFILE20

#defineNADDR10

#defineNHINO128

#defineUSERNUM10

#defineDINODESIZ72

#defineDINODEBLK32

#defineFILEBLK512

tfdefineNICFREESO

#defineNICINOD50

#defineDINODESTART1024

#defineDATASTART(2+DINODEBLK)*BLOCKSIZ

#defineDIEMPTY00000

#defineDIFILE01000

#defineDIDIR02000

#defineUDIREAD00001

#defineUDIWRITE00002

#defineUDIEXICUTE00004

#defineGDIREAD00010

#defineGDIWRITE00020

#defineGDIEXICUTE00040

#defineODIREAD00100

#defineODIWRITE00200

#defineODIEXICUTE00400

#defineREAD1

#defineWRITE2

#defineEXICUTE3

#defineDEFAULTMODE00777

#defineIUPDATE00002

#defineSUPDATE00001

#defineFREAD00001

#defineFWRITE00002

#defineFAPPEND00004

#defineDISKFULL65535

#defineSEEK_SETO

structinode

{

structinode*i_forw;

structinode*i_back;

chari_flag;

unsignedintijno;

unsignedinti_count;

unsignedintdi_addr[NADDR];

unsignedshortdi_number;

unsignedshortdi_mode;

unsignedshortdi_uid;

unsignedshortdi_gid;

unsignedshortdi_size;

);

structdinode

(

unsignedshortdi_number;

unsignedshortdi_mode;

unsignedshortdi_uid;

unsignedshortdi_gid;

unsignedlongdi_size;

unsignedintdi_addr[NADDR];

);

structdirect

chard_name[DIRSIZ];

unsignedintd_ino;

);

structfilsys

{

unsignedshortsjsize;

unsignedlongs_fsize;

unsignedints_nfree;

unsignedshorts_pfree;

unsignedints_free[NICFREE];

unsignedints_ninode;

unsignedshorts_pinode;

unsignedints_inode[NICINOD];

unsignedints_rinode;

chars_fmod;

);

structpwd

(

unsignedshortp_uid;

unsignedshortp_gid;

charpassword[PWDSIZ];

);

structdir

(

structdirectdirect[DIRNUM];

intsize;

);

structhinode

{

structinode*i_forw;

);

structfile

(

charf_flag;

unsignedintf_count;

structinode*f_inode;

unsignedlong

);

structuser

(

unsignedshortu_default_mode;

unsignedshortu_uid;

unsignedshortu_gid;

unsignedshortu_ofile(NOFILE];

);

externstructinode*aaa;

externstructhinodehinodefNHINO];

externstructdirdir;

externstructfilesys_ofile(SYSOPENFILE);

externstructfilsysfilsys;

externstructpwdpwd[PWDNUM];

externstructuseruser[USERNUM];

externstructinode*cur_path_inode;

externFILE*fd;

externintuser_id;

externstructinode*iget();

externiput();

externunsignedintballoc();

externbfreef);

externstructinode*ialloc();

externifree();

externintnamei();

externshortiname();

externunsignedintaccess();

extern_dir();

externmkdirf);

externchdir();

externunsignedshortopen(i;

externcreate();

externunsignedintread();

externunsignedintwrite();

externintlogin();

externlogout();

externinstall();

externformat();

externclose();

externhalt();

#endif

access.h

#include<stdio.h>

#include"structure.h"

unsignedintaccess(user_id,inode,mode)

unsignedintuser_id;

structinode*inode;

unsignedshortmode;

(

switch(mode)

(

caseREAD:

if(inode->di_mode&ODIREAD)return1;

if{(inode->di_mode&GDIREAD)&&

(user[user_id].u_gid==inode->di_gid))return1;

if((inode->di_mode&UDIREAD)&&

(user[user_id].u_uid==inode->di_uid))return1;

return0;

caseWRITE:

if(inode->di_mode&ODIWRITE)return1;

if((inode->di_mode&GDIWRITE)&&

(user[user_id].u_gid==inode->di_gid))return1;

if((inode->di_mode&UDIWRITE)&&

(user[user_id].u_uid==inode->di_uid))return1;

return0;

caseEXICUTE:

if(inode->di_mode&ODIEXICUTE)return1;

if((inode->di_mode&GDIEXICUTE)&&

(user[user_id].u_gid==inode->di_gid))return1;

if((inode->di_mode&UDIEXICUTE)&&

(user[user_id].u_uid==inode->di_uid))return1;

return0;

default:

return1;

)

)

ballfre.h

#include<stdio.h>

#include"structure.h"

staticunsignedintblock_buf[BLOCKSIZ/sizeof(int)];

unsignedintballoc()

(

unsignedintfree_block.:

intijlag;

if(filsys.s_nfree==O)

(

printf("\nDiskFull!!\n");

returnDISKFULL;

)

i=filsys.s_pfree;

flag=(i==0);

if(flag)〃该BLOCK组全部用了

(

fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_free[NICFREE-l]+l),SEEK_SET);

//filsys.s_free[NICFREE-l]+l指向下一个block组的地址块

fread(block_buf,l,BLOCKSIZ,fd);

for(i=0;i<NICFREE;i++)

(

filsys.s_free[i]=block_buf[i];

}〃将待用block组的地址读入超级块

filsys.s_pfree=NICFREE-l;

free_block=filsys.s_free[filsys.s_pfree);

else

free_block=filsys.s_free[filsys.s_pfree];

filsys.s_pfree-;

filsys.s_nfree-;

filsys.s_fmod=SUPDATE;

returnfree_block;

)

bfree(unsignedintblock_num)

(

inti;

if(filsys.s_pfree==NICFREE-l)

〃表示回收的block已经可以组成一个block组了

(

for(i=0;i<NICFREE;i++)

(

block_buf[i]=filsys.s_free[NICFREE-l-i];

}

fllsys.s_pfree=O;

fseek(fd/DATAS1ART+BLOCKSIZ*(filsys.s_free(0])/SEEK_SET);

〃filsys.s_free⑼为当前BLOCK组的地址块

fwrite(block_buf,l,BLOCKSIZ,fd);

)

elsefilsys.s_pfree++;

filsys.s_nfree++;

filsys.s_fmod=SUPDATE;

)

close.h

#include<stdio.h>

#include"structure.h"

close(user_idzcfd)

unsignedintuser_id;

unsignedshortcfd;

(

structinode*inode;

inode=sys_ofile[user[user_id].u_ofile[cfd]].fjnode;

iput(inode);

sys_ofile(user[user_id].u_ofile[cfd]].f_count-;

user(user_id].u_ofile(cfd]=SYSOPENFILE+l;

)

creat.h

creat(uid,filename,mode)

unsignedintuid;

char*filename;

unsignedshortmode;

(

intdi_ith,di_ino;

structinode*inode;

inti,j;

i=0;

while(i<USERNUM)〃user口的值由函数login。注册,参看文件log.h

(

if(user[i].u_uid==ud)

{

user_id=i;

break;

}

i++;

)

if(i==USERNUM)

(

printf("theuseridswrong.\n");

exi^l);

)

dl_lno=namel(filename];

if(di_ino!=-l)〃文件已经存在

(

inode=iget{di_ino);

if(access(user_id,irode,mode)==0)

(

iput(inode);

printf("\ncreataccessnotallowed\n");

return0;

}

for(i=0;i<inode->di_size/BLOCKSIZ+l;i++)

(

bfree(inode->di_addr[i]);

)

for(i=0;i<SYSOPENFILE;i++)

if(sys_ofile[i].f_inode==inode)

(

sys_ofile[i].f_off=0;

}

for(i=0;ivNOFILE;i++)

if(user(user_id].u_ofile[i]==SYSOPENFILE+l)

(

user[user_id].u_uid=inode->di_uid;

user[user_id].u_gid=inode->di_gid;

for(j=0;j<SYSOPENFILE;i++)

if(sys_ofile[j].f_count==0)

user(user_id].u_ofile(i]=j;

sys_ofile[j].f_flag=(char)mode;

)

returni;

}

)

else

(

inode=ialloc();

di_ith=iname(filename);

dir.size++;

dir.direct[di_ith].d_ino=inode->i_ino;

inode->di_mode=user[user_id].u_default_mode;

inode->di_uid=user[user_id].u_uid;

inode->di_gid=user[user_id].u_gid;

inode->di_size=0;

inode->di_number=0;

for(i=0;i<SYSOPENFILE;i++)

if(sys_ofile[i).f_count==0)

(

break;

)

for(j=0;j<NOFILE;i++)

if(user(user_id].u_ofile[j]==SYSOPENFILE+l)

(

break;

)

user[user_id].u_ofile[j]=i;

sys_ofile[i].f_flag=(char)mode;

sys_ofile[i].f_count=0;

sys_ofile[i].f_off=0;

sys_ofile[i].f_inode=inode;

returnj;

)

return0;

}

delete.h

#include<stdio.h>

#include"structure.h"

deletefchar*filename)

(

unsignedintdinodeid;

structinode*inode;

dinodeid=namei(filename);

if(dinodeid!=(int)NULL)

inode=iget(dinodeid);

inode->di_number-;

iput(inode);

)

dir.h

_dir()

(

unsignedintdi_mode;

inti,j,one;

structinode*temp_inode;

printf("CURRENTDIRECTORY:\n");

for{i=0;i<dir.size;i++)

(

if(dir.direct(il.d_ino!=DIEMPTY)

(

printf("%sDIRSIZ",dir.direct[i].d_name);

temp_inode=iget(dir.direct[i].d_ino);

di_mode=temp_inode->di_mode;

for(j=0;j<9;j++)

(

one=dl_mode%2;

di_mode=di_mode/2;

if(one)printff'x");

elseprintf("-");

)

if(temp_inode->di_mode&&DIFILE==l)

(

printf("%ld\n",temp_inode->di_size);

printf("blockchain:");

for(i=0;i<temp_inode->di_size/BLOCKSIZ+l;i++)

printf("%4d",temp_inode->di_addr[i]);

printf("\n");

)

elseprintf("<dir>\n");

iput(tempjnode);

)

)

)

mkdirfchar*dirname)

(

intdirid,dirpos;

structinode*inode;

structdirectbuf[BLOCKSIZ/(DIRSIZ+2)];

unsignedintblock;

dirid=namei(dirname);

if(dirid!=-l)//dirid==-l表示没有该目录名存在:

inode=iget(dirid);

if(inode->di_mode&DIDIR)

printf("\n%sdirectoryalreadyexisted!!\n");

else

printf("\n%sisafilename&cannotcreatadirthesamename",dirname);

iput(inode);

return0;

)

dirpos=iname(dirname);

inode=ialloc();

inode->ijno=dirpos;

dir.direct[dirpos].d_ino=inode->i_ino;

dir.size++;

strcpy(buf[O].d_name,",");

buf[0].d_ino=dirid;

strcpy(buf[l].d_name,

buf[l].d_ino=cur_path_inode->i_ino;

block=balloc();

fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);

fwrlte(buf,l,BLOCKSlZ,fd);

inode->di_size=2*(DIRSZ+2);

inode->di_number=l;

inode->di_mode=user[user_id].u_default_mode;

inode->di_uid=user[user_id].u_uid;

inode->di_gid=user[user_id].u_gid;

inode->di_addr[0]=block;

iput(inode);

return0;

)

chdir(char*dirname)

(

intdirid;

inttemp;

structinode*inode;

shortblock;

intij,low=0,high=0;

dirid=namei(dirname);

if(dirid=#include<stdio.h>

#include"structure.h"

deletefchar*filename)

(

unsignedintdinodeid;

structinode*inode;

dinodeid=namei(filename);

if(dinodeid!=(int)NULL)

inode=iget(dinodeid);

inode->di_number-;

iput(inode);

printf("\n%sdoesnotexisted\n",dirname);

return0;

)

inode=iget(dirid);

if(!access(userjdjnode,user(user_id).u_default_mode))

(

printf("\nhasnotaccesstothedirectory%s",dirname);

iput(inode);

return0;

)

for(i=0;i<dir.size;i++)

(

for(j=0;j<DIRNUM;j++)

(

temp=dlr.dlrect[J].d_lno;

if(dir.direct[j].d_ino==0||dir.direct[j].d_ino>MAX)break;

)

dir.direct[j].djno=0;

)

for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+l;i++)

(

bfree(cur_path_inode->di_addr[i]);

)

i=dir.size;

for(i=0;i<dir.size;i+=BL02KSIZ/(DIRSIZ+2))

(

block=balloc();

cur_path_inode->di_addr[i]=block;

fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);

fwrite(&dir.direct[i],l,BLOCKSIZ,fd);

)

cur_path_inode->di_size=dir.size*(DIRSIZ+2);

iput(cur_path_inode);

cur_path_inode=inode;

i=inode->di_size/BLOCKSIZ+l;

j=0;

for(i=0;i<inode->di_size/BLOCKSIZ+l;i++)

fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);

fread(&dir.direct[j],lzBL3CKSIZ,fd);

j+=BL0CKSIZ/(DIRSIZ+2);

)

return0;

)

format.h

format()

(

structinode*inode;

structdirectdir_buf[BL0CKSIZ/(DIRSIZ+2)];

structpwdpasswd(BLOCKSIZ/(PWDSIZ+4)];

structfilsysfilsys;

unsignedintblock_buf[BLOCKSIZ/sizeof(int)];

char*buf;

char*empty;

intij,k;

fd=fopen("filesystem","w+b");

buf=(char*)malloc((DINDDEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char));

if(fd==NULL)

(

printf("\nfilesystemfilecreatfailed!!\n");

exlt(O);

)

fseek(fd,O,SEEK_SET);

fwrite(buf,l,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char)/fd);

free(buf);

passwd[0].p_uid=2116;

passwd[0].p_gid=03;

strcpy(passwd[O].password,"donl");

passwd[l].p_uid=2117;

passwd[l].p_gid=03;

strcpy(passwd[l].password,"don2");

passwd[2].p_uid=2118;

passwd[2].p_gid=04;

strcpy(passwd[2].password,"abed");

passwd[3].p_uid=2119;

passwd[3].p_gid=04;

strcpy(passwd[3].password,"don4");

passwd[4].p_uid=2220;

passwd[4].p_gid=05;

strcpy(passwd[4].password,"donS");

inode=iget(0);

inode->di_mode=DIEMPTY;

iput(inode);

inode=iget(l);

inode->di_number=l;

inode->di_mode=DEFAULTMODE|DIDIR;

inode->di_size=3*(DIRSZ+2);

inode->di_addr[0]=0;

strcpy(dir_buf[O].d_name,

dir_buf[0].d_ino=l;

strcpy(dir_buf[l].d_name,".");

dir_buf[l].d_ino=l;

strcpy(dir_buf⑵.d_name,"etc");

dir_buf[2].d_ino=2;

fseek(fd,DATASTART,SEEK_SET);

fwrite(dir_buf,l,3*(DIRSIZ+2),fd);

iput(inode);

fseek(fd,1056,SEEK_SET);

fread(inode,DINODESIZJ,fd);

inode=iget(l);

iput(inode);

inode=iget(2);

inode->di_number=l;

inode->di_mode=DEFAULTMODE|DIDIR;

inode->di_size=3*(DIRSZ+2);

inode->di_addr[0]=l;

strcpy(dlr_buf[O].d_name,"..");

dir_buf[0].d_ino=l;

strcpy(dir_buf[l].d_name,".");

dir_buf[l].d_ino=2;

strcpy(dir_buf(2].d_name,"password");

dir_buf[2].d_ino=3;

fseek(fd,DATASTART+BLOCKSIZ*l,SEEK_SET);

fwrite(dir_buf,l,3*(DIRSIZ+2),fd);

iput(inode);

inode=iget(3);

inode->di_number=l;

inode->di_mode=DEFAULTMODE|DIFILE;

inode->di_size=BLOCKSIZ;

inode->di_addr[0]=2;

for(i=5;i<PWDNUM;i++)

(

passwd[i].p_uid=O;

passwd[i].p_gid=O;

strcpy(passwd[i].password,"");

}

fseek(fd,DATASTART+2*BLOCKSIZ,SEEK_SET);

fwrite(passwd,l,BLOCKSIZ,fd);

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_inode[i]=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_buf[NICFREE-l-j]=i-j;

)

fseek(fd,DATASTART+BL0CKSIZ*(i-49),SEEK_SET);

fwrite(block_buf,l,BLOCKSIZ,fd);

}〃当i=502之后,完成文件块502〜453的写入:

〃之后文件块512〜58不能进行,需要特殊处理

for(i=503;i<512;i++)

block_buf[i-503]=i;

fseek(fd,DATASTART+BLOCKSIZ*503,SEEK_SET);

fwrlte(block_bufj,BLOCKSiz,fd);〃至此,才完成512块文件块的定位

for(i=0;i<NICFREE;i++)

(

filsys.s_free[i]=i+3;〃从DATASTART的第一个BLOCK作为VIAINDIRECTORY

〃第二个BLOCK作为etc目录

〃第三个BLOCK作为password文件

〃故此i要加3

)

〃每50个BLOCK成组,在每个BLOCK组当中的第一个BLOCK(称为地址块)放有整个BLOCK

〃组的地址。这样,filsys.s_free[O]指向该组的地址块,而filsys.s_free[49]+l

〃那么指向下一个组的地加块。

j=l;

filsys.s_pfree=NICFREE-j;

filsys.s_pinode=0;

fseek(fd,BLOCKSIZ,SEEK_SET);

fwrite(&filsys,l,sizeof(structfilsys),fd);

fclose(fd);

)

halt.h

力include<stdio.h>

#include"structure.h"

halt()

(

inti,j;

for(i=0;i<USERNUM;i++<

if(user(i].u_uid!=O)

(

for(j=0;j<NOFILE;j++)

(

if(user[i].u_ofile[j]!=SYSOPENFILE+l)

(

close(user[i].u_ofile[j]);

user[i].u_ofile[j]=SYSOPENFILE+l;

)

)

)

)

fseek(fdzBLOCKSIZ,SEEK_SET);

fwrite(&filsys,l,sizeof(structfilsys),fd);

fclose(fd);

printf("\nGOODbye.SeeYouNextTime.Pleaseturnofftheswitch.\n");

exit(O);

)

iallfre.h

#include<stdio.h>

^include"structure.h"

staticstructdinodeblock_bufl[BLOCKSIZ/DINODESIZ];

structinode*ialloc()

(

structinode*tempjnode;

unsignedintcur_di;

inti,count,block_end_flag;

i=filsys.s_pinode;

if(filsys.s_pinode==NICINOD)

(

i=0;

count=0;

block_end_flag=l;

filsys.s_pinode=NICINOD-l;

cur_di=filsys.s_rinode;

while((count<NICINOD)||(count<=(int)filsys.s_ninode))

(

if(block_end_flag)

(

fseek(fd,DINODESTART+cur_di*DINODESIZ,SEEK_SET);

fread(block_bufl,l,BLOCKSIZ,fd);

block_end_flag=0;

i=0;

while(block_bufl[i].di_mode==DIEMPTY)

cur_di++;

i++;

)

if(i==NICINOD)

block_end_flag=l;

else

(

filsys.s_inode[filsys.s_pinode-]=cur_di;

count++;

)

)

filsys.s_rinode=cur_di;

)

i=filsys.s_inode[filsys.s_pinode];

temp_inode=iget(filsys.s_inode[filsys.s_pinode]);

fseek(fd/DINODESTART+filsys.s_inode[filsys.s_pinode]*DINODESIZ/SEEK_SET);

fwriteftempJnode^l/DINODESIZJd);

filsys.s_pinode++;

filsys.s_ninode-;

filsys.s_fmod=SUPDATE;

returntempjnode;

)

ifree(unsigneddinodeid)

(

filsys.s_ninode++;

if(filsys.s_pinode!=NICINOD)

(

filsys.s_inode[filsys.s_pinode]=dinodeid;

filsys.s_pinode++;

)

else

(

if(dinodeid<filsys.s_rinode)

(

filsys.s_inode[NICINOD]=dinodeid;

filsys.s_rinode=dinodeid;

)

)

)

igetput.h

structinode*iget(unsignedintdinodeid)

(

intexisted=0,inodeid;

longaddr;

structinode*temp,*newinode;

inodeid=dinodeid%NHINO;

if(hinode(inodeid].i_forw==NULL)temp=&hinode[inodeid);

else

(

temp=hinode[inodeid].i_forw;

while(temp->i_forw)

(

if((int)temp->i_ino==incdeid)

(

existed=l;

temp->i_count++;

returntemp;

)

else

temp=temp->i_forw;

};

)

addr=DINODESTART+dinodeid*DINODESIZ;

newinode=(structinode*)malloc(sizeof(structinode));

fseek(fd,addr,SEEK_SET);

fread(newinode,DINODESIZ,l,fd);

lf(hlnode[lnodeld].l_forw==NULL)

(

newinode->i_forw=hinode[inodeid].i_forw;

hinode[inodeid].i_forw=newinode;

newinode->i_back=&(hinode(inodeid]);

)

else

(

newinode->i_forw=hinode[inodeid].i_forw;

hinode[inodeid].i_forw=newinode;

newinode->i_back=newinode->i_forw->i_back;

newinode->i_forw->i_back=newinode;

)

newinode->i_count=l;

newinode->i_flag=0;

newinode->i_ino=dinodeid;

fseek(fd,addr,SEEK_SET);

fwrite(newinode,DINODESIZ,l,fd);

returnnewinode;

)

iputfstructinode*pinode)

(

longaddr;

unsignedintblock_num;

inti;

if(pinode->i_count>l)

pinode->i_count-;

else

(

if(pinode->di_numberl=0)

(

addr=DINODESTART+pinode->i_ino*DINODESIZ;

fseek(fd,addr,SEEK_SET);

fwrite(pinode,DINODESIZ,l,fd);

)

else

(

block_num=pinode->di_size/BLOCKSIZ;

for(i=0;i<(int)block_num;i++)

(

balloc(pinode->di_addr[i]);

)

ifree(pinode->i_ino);

};

lf(plnode->l_forw==NULL)

pinode->i_back->i_forw=NULL;

else

(

pinode->i_forw->i_back=pinode->i_back;

pinode->i_back->i_forw=pinode->i_forw;

);

free(pinode);

install.h

installf)

(

intij;

printf("install\n");

fd=fopen("filesystem"/"a+b");

if(fd==NULL)

(

printf("\nfilesyscannotbeloaded.\n");

exit(O);

)

fseek(fd,BLOCKSIZ,SEEK_SET);

fread(&filsys,l,sizeof(structfilsys),fd);

i=filsys.s_free[49);

for(i=0;i<NHINO;i++)

hinode[i).i_forw=NULL;

)

for(i=0;i<SYSOPENFILE;k+)

(

sys_ofile(i].f_count=0;

sys_ofile[i].f_inode=NULL;

)

for(i=0;i<USERNUM;i++)

(

user[i].u_uid=O;

user(i].u_gid=O;

for(j=0;j<NOFILE;j++)

(

user(i].u_ofile[j]=SYSOPENFILE+l;

)

)

cur_path_inode=iget(l);

dir.size=cur_path_inode->di_size/(DIRSIZ+2);

for(i=0;i<DIRNUM;i++)

(

strcpy(dlr.dlrect[l].d_name,"");

dir.direct[i].d_ino=0;

)

fseek(fd,DATASTART+BLOCKSIZ,SEEK_SET);

fread(&dir.direct[BLOCKSIZ/(DIRSIZ+2)],l,3*(DIRSIZ+2),fd);

for(i=0;i<dir.size;i++)

(

fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode->di_addr[i:,SEEK_SET);

fread(&dir.direct[(BLOCKSIZ/(DIRSIZ+2))*i]/l,cur_path_inode->di_size%BLOCKSIZ,fd);

log.h

install()

{

inti,j;

printf("install\n");

fd=fopen("filesystem","a+b");

if(fd==NULL)

(

printf("\nfilesyscannotbeloaded.\n");

exit(O);

)

fseek(fd,BLOCKSIZ,SEEK_SET);

fread(&filsys,l,sizeof(structfilsys),fd);

i=filsys.s_free[49];

for(i=0;i<NHINO;i++)

hinode[i].i_forw=NULL;

)

for(i=0;i<SYSOPENFILE;i++)

(

sys_ofile[i].f_count=0;

sys_ofile(i].f_inode=NULL;

}

for(i=0;i<USERNUM;i++)

(

user(i].u_uid=O;

user[i].u_gid=O;

for(j=0;j<NOFILE;j++)

(

user[i].u_ofile[j]=SYSOPENFILE+l;

)

)

cur_path_inode=iget{l);

dir.size=cur_path_inode->di_size/(DIRSIZ+2);

for(i=0;i<DIRNUM;i++)

(

strcpy(dir.direct[i].d_name,"");

dir.direct(i).d_ino=0;

}

fseek(fd,DATASTART+BLOCKSIZ,SEEK_SET);

fread(&dir.direct[BLOCKSIZ/(DIRSIZ+2)],l,3*(DIRSIZ+2),fd);

for(i=0;i<dir.size;i++)

(

fseek(fd,DATASTART+BLOCKSIZ*cur_path_inode->di_addr[i:,SEEK_SET);

#

fread(&dir.direct[(BLOCKSIZ/(DIRSIZ+2))i],lzcur_path_inode->di_size%BLOCKSIZ,fd);

)

)

name.h

#include<string.h>

#include<stdio.h>

#include"structure.h"

intnamei(char*name)

(

inti,notfound=l;

for(i=0;i<'clir.si2e;i++)

(

if(((strcmp(dir.direct[i].d_name,name)==0))&&(dir.direct[i].d_ino!=0))

(

returni;

)

return-1;

)

shortiname(char*name)

(

inti,notfound=l;

for(i=0;((i<DIRNUM)&&;notfound));i++)

if(dir.direct(i].d_ino==01|dir.direct[i].d_ino>MAX)

(

notfound=0;

break;

)

if(notfound)

(

printf("\nThecurrentdirectoryisfull!!!\n");

return-1;

)

else

(

strcpy(dir.direct[i).d_name,name);

dir.direct[i).d_ino=l;

returnI;

)

)

open.h

#include<stdio.h>

#include"structure.h"

unsignedshortopen(user_id,filename,openmode)

intuserjd;

char*filename;

unsignedshortopenmode;

(

unsignedintdinodeid;

structinode*inode;

intij;

dinodeid=namei(filename);

if(dinodeid!=(int)NULL)

(

printf("\nfiledoesnotexisted!!!\n");

return(int)NULL;

}

inode=iget(dinodeid);

if(!access(userjdjnode,openmode))

(

printf("\nfileopenhasnotaccess!!!\n");

iput(inode);

return(int)NULL;

}

for(i=l;i<SYSOPENFILE;i++)

if(sys_ofile[i].f_count==0)break;

if(i==SYSOPENFILE)

(

printf("\nsystemopenfietoomuch\n");

iput(inode);

return(int)NULL;

)

sys_ofile(i].f_inode=inode;

sys_ofile(i].f_flag=(char]openmode;

sys_ofile[i].f_count=l;

if(openmode&FAPPEND)

sys_ofile(i].f_off=inode->di_size;

else

sys_ofile[i).f_off=0;

for(j=0;j<NOFILE;j++)

if(user(user_id].u_ofile[j]==0)break;

if(j==NOFILE)

(

prlntf("\nuseropenflleroomuch!!!\n");

sys_ofile(i].f_count=0;

iput(inode);

return(int)NULL;

)

user(user_id].u_ofile[j]=l;

if(openmode&FAPPEND)

(

for(i=0;j<inode->di_size/BLOCKSIZ+l;i++)

bfree(inode->di_addr[i]|;

inode->di_size=0;

)

returnj;

)

rdwt.h

#include<stdio.h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论