实验5 Linux文件管理.docx
- 文档编号:2180126
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:48
- 大小:79.79KB
实验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;i { bfree(inode->di_addr[i]); } for(i=0;i if(sys_ofile[i].f_inode==inode) { sys_ofile[i].f_off=0; } for(i=0;i if(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;j 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 if(sys_ofile[i].f_count==0) { break; } for(j=0;j if(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验5 Linux文件管理 实验 Linux 文件 管理