版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广西南宁市法官检察官遴选试题及答案
- 2026年陕西省汉中市辅警人员招聘考试题库及答案
- 2026年检测机构人员能力评价试题及答案
- 2026年呼伦贝尔市辅警考试题库(含答案)
- 2026教师资格证中学教育知识与能力试题及答案
- 2026年校园意识形态考核试题及答案
- 公务员考试(公安专业)练习试题及答案(河南省郑州市2026年)
- 广西北海市2026年公务员(公共基础知识测验+基层工作实际能力测验)考前冲刺试题解析及答案
- 2026年水产苗种管理政策落实试题及答案
- 2026年城市露营设计师休闲服务刷题题库及答案
- 建筑工程中间验收流程与记录模板
- 2026年煤矿新工人机考题(附答案)
- 2025年全国青少年禁毒知识竞赛题库与答案
- 2026年人文知识竞赛通关题库含答案详解【培优】
- 2026年第三届红旗杯班组长竞赛能力提升题库【达标题】附答案详解
- 2026中国印刷电路板组装服务行业现状规模与投资前景预测报告
- 危货运输安全全程管控方案
- 沃尔沃底盘改装上装电路培训
- 临床认知障碍患者规范化护理
- 《NB∕T11728-2024高原环境27.5kV系统污秽绝缘爬电距离配置》
- 中秋月饼销售培训课件
评论
0/150
提交评论