实验5 Linux文件管理.docx
《实验5 Linux文件管理.docx》由会员分享,可在线阅读,更多相关《实验5 Linux文件管理.docx(48页珍藏版)》请在冰点文库上搜索。
实验5Linux文件管理
实验5Linux文件管理
一、实验目的
1.掌握Linux文件系统的基本原理、结构和实现方法
2.掌握Linux文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用
3.学会设计简单的文件系统并实现一组操作
4.通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握
二、实验内容
设计并实现一个一级文件系统程序,要求实现以下功能:
1.提供文件创建/删除接口命令create/delete、目录创建/删除接口命令mkdir/rmdir、显示目录内容命令ls等。
2.创建的文件不要求格式和内容。
三、实验结果
1.程序源代码
main.cpp
#include
#include
#include
#include
#include"structure.h"
#include"creat.h"
#include"access.h"
#include"ballfre.h"
#include"close.h"
#include"delete.h"
#include"dir.h"
#include"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_inode;
intuser_id;
/*kkkkk*/
unsignedshortusr_id;
charusr_p[12];
charsel;
chartemp_dir[12];
main()
{
unsignedshortab_fd1,ab_fd2,ab_fd3,ab_fd4,i,j;
char*buf;
intdone=1;
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);
/*printf("\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");/*зЂвт*/
sel=getchar();
sel=getchar();
switch(sel)
{
case'1':
_dir();
break;
case'2':
printf("pleaseinputdirname:
");
scanf("%s",temp_dir);
mkdir(temp_dir);
break;
case'3':
printf("pleaseinputdirname:
");
scanf("%s",temp_dir);
chdir(temp_dir);
break;
case'4':
printf("pleaseinputfilename:
");
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':
logout(usr_id);
halt();
done=0;
default:
printf("error!
\nNosuchcommand,pleasetryagain.\nOryoucanaskyourteacherforhelp.\n");
break;
}
}
}
else
printf("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
#defineNICFREE50
#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_SET0
structinode
{
structinode*i_forw;
structinode*i_back;
chari_flag;
unsignedinti_ino;
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
{
unsignedshorts_isize;
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;
unsignedlongf_off;
};
structuser
{
unsignedshortu_default_mode;
unsignedshortu_uid;
unsignedshortu_gid;
unsignedshortu_ofile[NOFILE];
};
externstructinode*aaa;
externstructhinodehinode[NHINO];
externstructdirdir;
externstructfilesys_ofile[SYSOPENFILE];
externstructfilsysfilsys;
externstructpwdpwd[PWDNUM];
externstructuseruser[USERNUM];
externstructinode*cur_path_inode;
externFILE*fd;
externintuser_id;
externstructinode*iget();
externiput();
externunsignedintballoc();
externbfree();
externstructinode*ialloc();
externifree();
externintnamei();
externshortiname();
externunsignedintaccess();
extern_dir();
externmkdir();
externchdir();
externunsignedshortopen();
externcreate();
externunsignedintread();
externunsignedintwrite();
externintlogin();
externlogout();
externinstall();
externformat();
externclose();
externhalt();
#endif
access.h
#include
#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
#include"structure.h"
staticunsignedintblock_buf[BLOCKSIZ/sizeof(int)];
unsignedintballoc()
{
unsignedintfree_block;
inti,flag;
if(filsys.s_nfree==0)
{
printf("\nDiskFull!
!
\n");
returnDISKFULL;
}
i=filsys.s_pfree;
flag=(i==0);
if(flag)//该BLOCK组全部用了
{
fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_free[NICFREE-1]+1),SEEK_SET);
//filsys.s_free[NICFREE-1]+1指向下一个block组的地址块
fread(block_buf,1,BLOCKSIZ,fd);
for(i=0;i{
filsys.s_free[i]=block_buf[i];
}//将待用block组的地址读入超级块
filsys.s_pfree=NICFREE-1;
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-1)
//表示回收的block已经可以组成一个block组了
{
for(i=0;i{
block_buf[i]=filsys.s_free[NICFREE-1-i];
}
filsys.s_pfree=0;
fseek(fd,DATASTART+BLOCKSIZ*(filsys.s_free[0]),SEEK_SET);
//filsys.s_free[0]为当前BLOCK组的地址块
fwrite(block_buf,1,BLOCKSIZ,fd);
}
elsefilsys.s_pfree++;
filsys.s_nfree++;
filsys.s_fmod=SUPDATE;
}
close.h
#include
#include"structure.h"
close(user_id,cfd)
unsignedintuser_id;
unsignedshortcfd;
{
structinode*inode;
inode=sys_ofile[user[user_id].u_ofile[cfd]].f_inode;
iput(inode);
sys_ofile[user[user_id].u_ofile[cfd]].f_count--;
user[user_id].u_ofile[cfd]=SYSOPENFILE+1;
}
creat.h
creat(uid,filename,mode)
unsignedintuid;
char*filename;
unsignedshortmode;
{
intdi_ith,di_ino;
structinode*inode;
inti,j;
i=0;
while(i{
if(user[i].u_uid==uid)
{
user_id=i;
break;
}
i++;
}
if(i==USERNUM)
{
printf("theuseridiswrong.\n");
exit
(1);
}
di_ino=namei(filename);
if(di_ino!
=-1)//文件已经存在
{
inode=iget(di_ino);
if(access(user_id,inode,mode)==0)
{
iput(inode);
printf("\ncreataccessnotallowed\n");
return0;
}
for(i=0;idi_size/BLOCKSIZ+1;i++)
{
bfree(inode->di_addr[i]);
}
for(i=0;iif(sys_ofile[i].f_inode==inode)
{
sys_ofile[i].f_off=0;
}
for(i=0;iif(user[user_id].u_ofile[i]==SYSOPENFILE+1)
{
user[user_id].u_uid=inode->di_uid;
user[user_id].u_gid=inode->di_gid;
for(j=0;jif(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;iif(sys_ofile[i].f_count==0)
{
break;
}
for(j=0;jif(user[user_id].u_ofile[j]==SYSOPENFILE+1)
{
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
#include"structure.h"
delete(char*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
{
if(di