实验5 Linux文件管理.docx

上传人:b****1 文档编号:2180126 上传时间:2023-05-02 格式:DOCX 页数:48 大小:79.79KB
下载 相关 举报
实验5 Linux文件管理.docx_第1页
第1页 / 共48页
实验5 Linux文件管理.docx_第2页
第2页 / 共48页
实验5 Linux文件管理.docx_第3页
第3页 / 共48页
实验5 Linux文件管理.docx_第4页
第4页 / 共48页
实验5 Linux文件管理.docx_第5页
第5页 / 共48页
实验5 Linux文件管理.docx_第6页
第6页 / 共48页
实验5 Linux文件管理.docx_第7页
第7页 / 共48页
实验5 Linux文件管理.docx_第8页
第8页 / 共48页
实验5 Linux文件管理.docx_第9页
第9页 / 共48页
实验5 Linux文件管理.docx_第10页
第10页 / 共48页
实验5 Linux文件管理.docx_第11页
第11页 / 共48页
实验5 Linux文件管理.docx_第12页
第12页 / 共48页
实验5 Linux文件管理.docx_第13页
第13页 / 共48页
实验5 Linux文件管理.docx_第14页
第14页 / 共48页
实验5 Linux文件管理.docx_第15页
第15页 / 共48页
实验5 Linux文件管理.docx_第16页
第16页 / 共48页
实验5 Linux文件管理.docx_第17页
第17页 / 共48页
实验5 Linux文件管理.docx_第18页
第18页 / 共48页
实验5 Linux文件管理.docx_第19页
第19页 / 共48页
实验5 Linux文件管理.docx_第20页
第20页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验5 Linux文件管理.docx

《实验5 Linux文件管理.docx》由会员分享,可在线阅读,更多相关《实验5 Linux文件管理.docx(48页珍藏版)》请在冰点文库上搜索。

实验5 Linux文件管理.docx

实验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;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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2