计算机操作系统教程实验指导第2版.docx
- 文档编号:9487652
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:26
- 大小:19.32KB
计算机操作系统教程实验指导第2版.docx
《计算机操作系统教程实验指导第2版.docx》由会员分享,可在线阅读,更多相关《计算机操作系统教程实验指导第2版.docx(26页珍藏版)》请在冰豆网上搜索。
计算机操作系统教程实验指导第2版
1.编程管理文件makefike
filsys:
main.oingetput.oiallfre.oballfre.oname.oaccess.olog.oclose.ocreat.o
delete.odir.oopen.ordwt.oformat.oinstall.ohalt.occ-ofilsysmain.o
ingetput.oiallfre.oballfre.oname.oaccess.olog.oclose.ocreat.odelete.odir.o
open.ordwt.oformat.oinstall.ohalt.o
main.o:
main.cfilesys.hcc-cmain.c
igetput.o:
igetput.cfilesys.hcc-cigetput.c
iallfre.o:
iallfre.cfilesys.hcc-ciallfre.c
ballfre.o:
ballfre.cfilesys.hcc-cballfre.c
name.o:
name.cfilesys.hcc-cname.c
accesse.o:
access.cfilesys.hcc-caccess.c
log.o:
log.cfilesys.hcc-clog.c
close.o:
close.cfilesys.hcc-cclose.c
creat.o:
creat.cfilesys.hcc-ccreat.c
delete.o:
delete.cfilesys.hcc-cdelete.c
dir.o:
dir.cfilesys.hcc-cdir.c
open.o:
open.cfilesys.hcc-copen.c
rdwt.o:
rdwt.cfilesys.hcc-crdwt.c
format.o:
format.cfilesys.hcc-cformat.c
install.o:
install.cfilesys.hcc-cinstall.c
halt.o:
halt.ccc-chalt.c
2.头文件filesye.h
#defineBLOCKSIZE512
#defineSYSOPENFILE40
#defineDIRNUM128
#definePWDSIZ14
#definePWDNUM12
#defineNOFILE20
#defineNADDR10
#defineNHINO128
#defineUSERNUM10
#defineDINODESIZ32
#defineFILEBLK512
#defineNICFREE50
#defineNICNOD50
#defineDINODESTART2*BLOCKSIZ
#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
#defineDISKFULL65525
#defineSEEL..SET0
/*文件系统数据结构*、
structinode{
structinode*i_frow;
structinode*i_back;
chari_flag;
unsignedinti_ino;
unsignedinti_count;
unsignedshortdi_number;
unsignedshortdi_moder;
unsignedshortdi_uid;
unsignedshortdi_gid;
unsignedshortdi_size;
unsignedintdi_addr[NADDR];
};
structdinode{
unsignedshortdi_number;
unsignedshortdi_moder;
unsignedshortdi_uid;
unsignedshortdi_gid;
unsignedlongdi_size;
unsignedintdi_addr[NADDR];
};
structdireet{
chard_name[DIRSIZ];
unsignedintd_ino;
};
structfilsys{
unsignedshorts_size;
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;
charpssword[PWDSIZE];
};
strcutdir{
structdirectdirect[DIRNUM];
intsize;
};
structhinode{
structinode*i_forw;
};
structuser{
unsignedshortu_default_mode;
unsignedshortu_uid;
unsignedshortu_gid;
unsignedshortu_ofile[NOFILE];
};
/*下为全局变量*/
externstructhinodehinode[NHINO];
externstructdirdir;
externstructfilesys_ofile[SYSOPENFILE];
externstructfilsysfilsys;
externstructpwdpwd{PWDNUM];
externFILE*fd;
externstructinode*cur_path_inode;
externintuser_id;
externstructinode*iget()
externiput();
externunsignedintballoc();
externbfree();
externstructinode*ialloc();
externifree();
externunsignedintnamei();
externunsignedshortiname();
externunsignedintaccess();
extern_dir();
externmkdir();
externchdir();
externunsignedshortopen();
externcreat();
externunsignedintread();
externunsignedintwrite();
externintlogin();
externinstall();
externformat();
externclose();
externhalt();
3.主程序main()(文件名main.c)
#include
#include"filesys.h"
structhinodehinode[NHINO];
structdirdir;
structfilesys_ofile[SYSOPENFILE];
structfilsysfilsys;
structpwdpwd[PWDNUM];
structuseruser[USERNUM];
FILE*fd;
structinode*cur_path_inode;
intuer_id;
main()
{
unsignedshortab_fd1,ab_fd2,ab_fd3,ab_fd4;
unsignedshortbhy_fd1;
char*buf;
printf("\nDoyouwanttoformatthedisk\n");
if(getchar()=='y')
printf("\nFormatwilleraseallcontextonthedisk\n");
if(getchar()=='y')
format();
install();
_dir();
long(2118,"abcd");
user_id=0;
mkdir("a2118");
chdir("a2118");
wj_fd1=creat(2118,"ab_file0.c",01777);
buf=(char*)malloc(BLOCKSIZ*6+5);
write(ab_fd1,buf,BLOCKSIZ*6+5);
close(user_id,ab_fd1);
free(buf);
mkdir("subdir");
chdir("subdir");
wj_fd2=creat(2118,"file1.c",01777);
buf=(char*)malloc(BLOCKSIZ*4+20);
write(ab_fd2,buf,BLOCKSIZ*4+20);
close(user_id,ab_fd2);
free(buf);
chdir("..");
ab_fd3=creat(2118,"_file2.c",01777);
buf=(char*)malloc(BLOCKSIZ*10+255);
write(ab_fd3,buf,BLOCKSIZ*3+255);
close(ab_fd3);
free(buf);
delete("ab_file0.c");
ab_fd4=creat(2118,"ab_file3.c",01777);
buf=(char*)malloc(BLOCKSIZ*8+300);
write(ab_fd4,buf,BLOCKSIZ*8+300);
close(ab_fd4);
free(buf);
ab_fd3=open(2188,"ab_file2.c",FAPPEND);
buf=(char*)malloc(BLOCKSIZ*3+100);
write(ab_fd3,buf,BLOCKSIZ*3+100);
close(ab_fd3);
free(buf);
_dir();
chdir("..");
logout();
halt();
}
4.初始化磁盘格式程序format()(文件名format.c)
#include
#include"filesys.h"
format()
{
structinode*inode;
structdirectdir_buf[BLOCKSIZ/(DIRSIZ+2)];
structpwdpasswd[BLOCKSIZ/(PWDSIZ+4)];
/*{
{2116,03,"dddd"};
{2117,03,"bbbb"};
{2118,04,"abcd"};
{2119,04,"cccc"};
{2220,05,"eeee"};
};
*/
structfilsys;
unsignedintblock_buf[BLOCKSIZ/sizeof(int)];
char*buf;
inti,j;
/*creatthefilesystemfile*/
fd=fopen("filesystem","r+w+b");
buf=(char*)malloc(DINODENLK+FILEBLK+2)*BLOCKSIZ*sizeof(char));
if(buf==NULL)
{
printf("\nfilesystemfilecreatfailed!
!
!
\n");
exit(0);
}
fseek(fd,0,SEEK_SET);
fwrite(buf,1,(DINODENLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd);
/*0.initializethepasswd*/
passwd[0].p_uid=2116;passwd[0].p_gid=03;
strcpy(passwd[0].password,"dddd");
passwd[1].p_uid=2117;passwd[1].p_gid=03;
strcpy(passwd[1].password,"bbbb");
passwd[2].p_uid=2118;passwd[2].p_gid=04;
strcpy(passwd[2].password,"abcd");
passwd[3].p_uid=2119;passwd[3].p_gid=04;
strcpy(passwd[3].password,"cccc");
passwd[4].p_uid=2220;passwd[4].p_gid=05;
strcpy(passwd[4].password,"eeee");
/*1.Creatthemaindirectoryanditssubdiretcandthefilepassword*/
inode=iget(0);/*0emptydinodeid*/
inode—>di_moder=DIEMPTY;
iput(inode);
inode=iget
(1);/*1maindirid*/
inode—>di_number=1;
inode—>di_moder=DEFAULTMODE|DIDIR;
inode—>di_size=3*(DIRSIZ+2);
inode—>di_addr[0]=0;/*block0#isusedbythemaindirectory*/
strcpy(dir_buf[0].d_name,"..");
dir_buf[0].d_ino=1;
strcpy(dir_buf[1].d_name,"..");
dir_buf[1].d_ino=1;
strcpy(dir_buf[2].d_name,"etc");
dir_buf[2].d_ino=2;
fseek(fd,DATASTART,SEEK_SET);
fwrite(dir_buf,1,3*(DIRSIZ+2),fd);
iput(jnode);
inode=iget
(2);/*2etcdirid*/
inode—>di_number=1;
inode—>di_moder=DEFAULTMODE|DIDIR;
inode—>di_size=3*(DIRSIZ+2);
inode—>di_addr[0]=1;/*block1#isusedbythemaindirectory*/
strcpy(dir_buf[0].d_name,"..");
dir_buf[0].d_ino=1;
strcpy(dir_buf[1].d_name,".");
dir_buf[1].d_ino=2;
strcpy(dir_buf[2].d_name,"password");
dir_buf[2].d_ino=3;
fseek(fd,DATASTART,+BLOCKSIZ*1,SEEK_SET);
fwrite(dir_buf,1,3*(DIRSIZ+2),fd);
iput(jnode);
inode=iget(3);/*2passwordid*/
inode—>di_number=1;
inode—>di_moder=DEFAULTMODE|DIDIR;
inode—>di_size=BLOCKSIZ;
inode—>di_addr[0]=2;/*block2#isusedbythemainfile*/
for(i=5,i { passwd[i].p_uid=0; passwd[i].p_gid=0; strcpy(passwd[i].password,""); } fseek(fd,DATASTART,+BLOCKSIZ*2,SEEK_SET); fwrite(passwd,1,BLOCKSIZ,fd); iput(jnode); /*2.initializethesuperblock*/ fisys.s_isize=DINODEBLK; fisys.s_fsize=FILEBLK; fisys.s_ninode=DINODEBLK*BLOCKSIZ/DINODEBLK-4; fisys.s_nfree=FILEBLK-3; for(i=0;i<=NICINOD;i++) {/*beginwith4,0,1,2,3,isusedbymain,etc,password*/ fisys.s_inode[i]=4+i; } fisys.s_pinode=0; fisys.s_rinode=NICINOD+4; block_buf[NICFREE-1]=FILEBLK+1;/*FILEBLK+1isaflagofend*/ for(i=0;i<=NICFREE-1;i++) block_buf[NICFREE-2-i]=FILEBLK-i; fseek(fd,DATASTART+BLOCKSIZ*(FILEBLK-NICFREE-1),SEEK_SET); fwrite(block_buf,1,BLOCKSIZ,fd); for(i=FILEBLK-NICFREE-1;i>2;i-=NICFREE) { for(j=0;j { block_buf[j]=i-j; } fseek(fd,DATASTART+BLOCKSIZ*(i-1),SEEK_SET); fwrite(block_buf,1,BLOCKSIZ,fd); } j=1; for(i=i;i>2;i--) { filsys.s_free[NICFREE+i-j]=i; } filsys.s_pfree=NICFREE-j; filsys.s_pinode=0; fseek(fd,BLOCKSIZ),SEEK_SET); fwrite(&filsys,1,sizeof(structfilsys),fd); } 5.进入文件系统程序install()(文件名install.c) #include #include #include"filesys.h" install() { inti,j; /*0.openthefilecolumn*/ fd=fopen("filesystem","w+r+b"); if(fd=NULL) { printf("\nfilesyscannotbeloaded\n); exit(0); } /*1.readthefilsysfromthesuperblock*/ fseek(fd,BLOCKSOZ,SEEK_SET); fwrite(&filsys,1,,sizeof(structfilsys),fd); /*2.initializetheinodebashchain*/ for(i=0;i { hinode[i].i_forw=NULL; } /*3.initializethesys_ofile*/ for(i=0;i { sys_ofile[i].f_count=0; sys_ofile[i].f_inode=NULL; } /*4.initializetheuser*/ for(i=0;i { user[i].u_uid=0; user[i].u_gid=0; for(j=0;j { user[i].u_ofile[j]=SYSOPENFILE+1; } } /*5.Readthemaindirectorytoinitializethedir*/ cut_path_inode=iger (1); dir.size=cur_path_inode->di_size/(DIRSIZ+2); for(i=0;i { strcpy(dir.direct[i].d_name,""); dir.direct[i].d_ino=0; } for(i=0;i { fseek(fd,DATASTART+BLOCKSIZ*cut_path_inode->di_addr[i],SEEK_SET); fread(&dir.direct[(BLOCKSIZ/(DIRSIZ+2))*i],1,BLOCKSIZ,fd); } fseek(fd,DATASTART+BLOCKSIZ*cut_path_inode->di_addr[i],SEEK_SET); fread(&dir.direct[(BLOCKSIZ/(DIRSIZ+2))*i],1, cut_path_inode->di_size%BLOCKSIZ,fd);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 教程 实验 指导