马天宇操作系统集中上机.docx
- 文档编号:9151544
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:30
- 大小:499.96KB
马天宇操作系统集中上机.docx
《马天宇操作系统集中上机.docx》由会员分享,可在线阅读,更多相关《马天宇操作系统集中上机.docx(30页珍藏版)》请在冰豆网上搜索。
马天宇操作系统集中上机
操作系统上机实习实验报告
学院:
计算机学院
专业:
计算机科学与技术专业
目录
一、实验题目及要求:
3
二:
实验目的:
3
三:
实验环境:
4
四:
实验步骤:
4
五:
实验重要功能及其说明:
5
六:
简单测试过程:
30
七:
实验结果31
八:
源代码33
九;心得体会:
38
十:
参考资料40
操作系统课程设计实验报告
1、实验题目及要求:
准备一个U盘,在Linux下编写一个用户程序,对U盘上的文件进行管理,要求提供如
下一组函数:
1、设计并实现一个目录列表函数(类似Linux的shell命令ls)。
该函数只需包含基本命令即可,不必想Linux中ls那样有很多命令选项。
2.、设计并实现一个改变目录的函数,即把当前目录切换到上一层目录或当前目录的子目录中(无需处理路径名)。
3、设计并实现一个删除文件的函数,该函数使用要删除的文件名(在当前目录中)作为参数。
该函数需要查找文件,遍历FAT中的链接。
在删除的情况下,要注意文件的隐藏、只读和系统属性,任何具有这些设置的文件都不能删除。
二:
实验目的:
1熟悉linux的一些基本操作命令;
2;掌握用linux下的vi编辑器编写程序;
3学会自己写程序对操作系统中的文件进行简单的管理。
4:
深入的理解文件在操作系统中是如何存储的,以及启动项,fat分配表,根目录,数据区等等。
5通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材的重点的算法理解同时通过编程实现这些算法,更好的掌握操作系统的原理及实现方法。
提高整体对操作系统的认识。
三:
实验环境:
Linux操作系统
Vi编辑器
Gcc编译器
U盘(须是fat16格式的)
四:
实验步骤:
1.安装linux操作系统(ubuntu);
2.安装vi编辑器,安装gcc编译器等重要的工具;
3.进入vi编辑器,开始输入代码;
4.编译,执行;
5.测试。
五:
实验重要功能及其说明:
1:
文件的基本流程图
2:
文件的基本功能实现原理
◆创建目录功能:
函数为ud_md(),接受参数为要在当前目录下创建的子目录的名称。
创建成功则返回值为1,失败则返回值为-1,若当前目录下存在同名子目录,则不创建目录并打印提示信息;该函数先遍历FAT表,找到一个空簇作为提供给将要创建的目录结构中的首簇指向;之后获取新建的子目录在根目录区的存储地址,并将各字节信息存入。
代码如下:
intud_md(char*directory)
{
Entry*pentry;
intret,i=0,cluster_addr,offset;
unsignedshortcluster;
charc[DIR_ENTRY_SIZE];
intindex;
charbuf[DIR_ENTRY_SIZE];
structtm*local;
time_tt;
intcutime,cudate;
t=time(NULL);
local=localtime(&t);
cutime=local->tm_hour*2048+local->tm_min*32+local->tm_sec/2;
cudate=(local->tm_year+1900-1980)*512+(local->tm_mon+1)*32+local->tm_mday;
pentry=(Entry*)malloc(sizeof(Entry));
ret=scanEntry(directory,pentry,1);//扫描根目录,是否已存在该目录名
if(ret<0)
{
for(cluster=2;cluster<1000;cluster++)
{
index=cluster*2;
if(fatbuf[index]==0x00&&fatbuf[index+1]==0x00)
{
/*在fat表中写入0xffff*/
fatbuf[index]=0xff;
fatbuf[index+1]=0xff;
break;
}
}
if(curdir==NULL)//往根目录下写文件
{
if((ret=lseek(fd,ROOTDIR_OFFSET,SEEK_SET))<0)
perror("lseekROOTDIR_OFFSETfailed");
offset=ROOTDIR_OFFSET;
while(offset { if((ret=read(fd,buf,DIR_ENTRY_SIZE))<0) perror("readentryfailed"); offset+=abs(ret); if(buf[0]! =0xe5&&buf[0]! =0x00) { while(buf[11]==0x0f) { if((ret=read(fd,buf,DIR_ENTRY_SIZE))<0) perror("readrootdirfailed"); offset+=abs(ret); } } else//找出空目录项或已删除的目录项 { offset=offset-abs(ret); for(i=0;i<=strlen(directory);i++) c[i]=toupper(directory[i]); for(;i<=10;i++) c[i]=''; c[0x0b]=0x10; /*写时间和日期*/ c[0x16]=(cutime&0x00ff); c[0x17]=((cutime&0xff00)>>8); c[0x18]=(cudate&0x00ff); c[0x19]=((cudate&0xff00)>>8); /*写第一簇的值*/ c[0x1a]=(cluster&0x00ff); c[0x1b]=((cluster&0xff00)>>8); /*写目录的大小*/ c[0x1c]=(0x00000000&0x000000ff); c[0x1d]=((0x00000000&0x0000ff00)>>8); c[0x1e]=((0x00000000&0x00ff0000)>>16); c[0x1f]=((0x00000000&0xff000000)>>24); if(lseek(fd,offset,SEEK_SET)<0) perror("lseekud_mdfailed"); if(write(fd,&c,DIR_ENTRY_SIZE)<0) perror("writefailed"); free(pentry); if(writeFat()<0) exit (1); return1; } } } else { cluster_addr=(curdir->FirstCluster-2)*CLUSTER_SIZE+DATA_OFFSET; if((ret=lseek(fd,cluster_addr,SEEK_SET))<0) perror("lseekcluster_addrfailed"); offset=cluster_addr; while(offset { if((ret=read(fd,buf,DIR_ENTRY_SIZE))<0) perror("readentryfailed"); offset+=abs(ret); if(buf[0]! =0xe5&&buf[0]! =0x00) { while(buf[11]==0x0f) { if((ret=read(fd,buf,DIR_ENTRY_SIZE))<0) perror("readrootdirfailed"); offset+=abs(ret); } } else { offset=offset-abs(ret); for(i=0;i<=strlen(directory);i++) c[i]=toupper(directory[i]); for(;i<=10;i++) c[i]=''; c[0x0b]=0x10; /*写时间和日期*/ c[0x16]=(cutime&0x00ff); c[0x17]=((cutime&0xff00)>>8); c[0x18]=(cudate&0x00ff); c[0x19]=((cudate&0xff00)>>8); /*写第一簇的值*/ c[0x1a]=(cluster&0x00ff); c[0x1b]=((cluster&0xff00)>>8); /*写目录的大小*/ c[0x1c]=(0x00000000&0x000000ff); c[0x1d]=((0x00000000&0x0000ff00)>>8); c[0x1e]=((0x00000000&0x00ff0000)>>16); c[0x1f]=((0x00000000&0xff000000)>>24); if(lseek(fd,offset,SEEK_SET)<0) perror("lseekud_mdfailed"); if(write(fd,&c,DIR_ENTRY_SIZE)<0) perror("writefailed"); free(pentry); if(writeFat()<0) exit (1); return1; } } } } else { printf("Thisdirectoryisexist\n"); free(pentry); return-1; } return1; } ◆删除目录功能: 函数名为intud_dd(),接受参数为要删除当前目录下的子目录名称。 删除成功则返回值为1,失败则返回值为-1。 该函数先遍历当前目录,获得要删除子目录的目录项结构信息。 直接调用clearFatCluster()函数清除FAT表中该目录的记录. 代码如下: intud_dd(char*directory) { Entry*pentry; intret; unsignedcharc; charch; unsignedshortseed,next; pentry=(Entry*)malloc(sizeof(Entry)); ret=scanEntry(directory,pentry,1);//扫描当前目录查找目录 if(ret<0) { printf("nosuchdirectory\n"); free(pentry); return-1; } //清除fat表项 seed=pentry->FirstCluster; while((next=getFatCluster(seed))! =0xffff) { clearFatCluster(seed); seed=next; } clearFatCluster(seed); //清除目录表项 c=0xe5; if(lseek(fd,ret-0x20,SEEK_SET)<0) perror("lseekud_ddfailed"); if(write(fd,&c,1)<0) perror("writefailed"); if(lseek(fd,ret-0x40,SEEK_SET)<0) perror("lseekud_ddfailed"); if(write(fd,&c,1)<0) perror("writefailed"); free(pentry); if(writeFat()<0) exit (1); return1; } ◆切换目录功能: 函数名为intud_cd(char*directory),如果输入的是cd.则保持当前目录不变;若为cd..则跳转到当前目录的父目录,同时修改存储低级目录的记录表指向的目录地址;如果输入的是cd“目录名”,将要跳转的子目录名作为参数传递能intud_cd函数进行处理,将当前目录修改为该目录名称所指向的目录,并将改变前的目录存入存储当前目录的父级目录的记录表中。 代码如下: intud_cd(char*directory) { Entry*pentry; intret; if(strcmp(directory,".")==0) { return1; } if(strcmp(directory,"..")==0&&curdir==NULL) return1; /*返回上一级目录*/ if(strcmp(directory,"..")==0&&curdir! =NULL) { curdir=fatherdir[dirno]; dirno--; return1; } pentry=(Entry*)malloc(sizeof(Entry)); ret=scanEntry(directory,pentry,1); if(ret<0) { printf("nosuchdirectory\n"); free(pentry); return-1; } dirno++; fatherdir[dirno]=curdir; curdir=pentry; return1; } ◆创建文件功能: 函数名为intud_cf(char*file,intsize),表示在当前目录下创建文件大小为size,文件名为file的文件。 若创建成功则返回1,不成功则是返回-1,并且给出相应的提示信息。 ◆删除文件功能: 函数名为intud_df(char*file),首先在当前目录下寻找是否有文件名为file的文件,如果没有则提示用户要删除的文件名不存在,若存在,则直接清除fat表中该文件的记录。 若删除成功,返回1;不成功返回-1。 代码如下: intud_df(char*filename) { Entry*pentry; intret; unsignedcharc; unsignedshortseed,next; pentry=(Entry*)malloc(sizeof(Entry)); ret=scanEntry(filename,pentry,0);//扫描当前目录查找文件 if(ret<0) { printf("nosuchfile\n"); free(pentry); return-1; } seed=pentry->FirstCluster; while((next=getFatCluster(seed))! =0xffff) { clearFatCluster(seed); seed=next; } clearFatCluster(seed); c=0xe5; if(lseek(fd,ret-0x20,SEEK_SET)<0) perror("lseekud_dffailed"); if(write(fd,&c,1)<0) perror("writefailed"); if(lseek(fd,ret-0x40,SEEK_SET)<0) perror("lseekud_dffailed"); if(write(fd,&c,1)<0) perror("writefailed"); free(pentry); if(writeFat()<0) exit (1); return1; } ◆子目录或文件列表功能: 函数名为intud_ls(),功能为列出当前目录下的子目录或者是当前目录下的文件信息。 在该函数中,从当前目录的起始地址开始遍历,获取当前目录下的子目录地址以及文件地址,并打印显示,这样就实现了子目录或文件列表显示功能。 成功则返回1,失败返回-1。 代码如下: intud_ls() { intret,offset,cluster_addr; inti; Entryentry; unsignedcharbuf[DIR_ENTRY_SIZE]; if((ret=read(fd,buf,DIR_ENTRY_SIZE))<0) perror("readentryfailed"); if(curdir==NULL) printf("Root_dir\n"); else printf("%s_dir\n",curdir->short_name); printf("\tname\t\tdate\t\ttime\t\tcluster\tsize\tattr\n"); if(curdir==NULL)//显示根目录区 { if((ret=lseek(fd,ROOTDIR_OFFSET,SEEK_SET))<0) perror("lseekROOTDIR_OFFSETfailed"); offset=ROOTDIR_OFFSET; /*从根目录区开始遍历,直到数据区起始地址*/ while(offset { ret=getEntry(&entry); offset+=abs(ret); if(ret>0) { printf("%16s\t" "%d-%d-%d\t" "%d: %d: %d\t" "%d\t" "%d\t" "%s\n", entry.short_name, entry.year,entry.month,entry.day, entry.hour,entry.minute,entry.second, entry.FirstCluster, entry.size, (entry.subdir)? "dir": "file"); } } } else//显示子目录 { cluster_addr=DATA_OFFSET+(curdir->FirstCluster-2)*CLUSTER_SIZE; if((ret=lseek(fd,cluster_addr,SEEK_SET))<0) perror("lseekcluster_addrfailed"); offset=cluster_addr; /*只读一簇的内容*/ while(offset { ret=getEntry(&entry); offset+=abs(ret); if(ret>0) { printf("%16s\t" "%d-%d-%d\t" "%d: %d: %d\t" "%d\t" "%d\t" "%s\n", entry.short_name, entry.year,entry.month,entry.day, entry.hour,entry.minute,entry.second, entry.FirstCluster, entry.size, (entry.subdir)? "dir": "file"); } } } return1; } 其它的一些函数: Voidprint()函数,该函数实现的功能是: 指导用户使用。 voiddo_usage() { printf("pleaseinputacommand,includingfollowings: \n"); printf("\tls_c\t\tlistallentriesundercurrentdirectory\n" "\tcd "\tcf "\tmd "\tdf "\tdd "\texit\t\t\texitthissystem\n"); } 文件名格式化函数: 实现将带小写字母的文件名或目录名格式化成完全为大写字母的文件名或目录名。 voidformatName(unsignedchar*name) { unsignedchar*p=name; while(*p! ='\0') p++; p--; while(*p=='') p--; p++; *p='\0'; } 主函数: 实现测试功能 intmain() { charinput[10]; intsize=0; inti,j,k,num; charname[30],subname[30]; if((fd=open(DEVNAME,O_RDWR))<0) perror("openfailed"); scanBootSector(); if(readFat()<0) exit (1); print(); while (1) { memset(name,0,30); printf(">"); scanf("%s",input
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 马天宇 操作系统集中上机 天宇 操作系统 集中 上机