西安郵電大學
操作系统课程设计
报告书
院系名称:软件工程
学生姓名:蒋博
专业名称:软件工程
班级:1202班
学号:04123038
时间:2015 年4月13 日至2015 年4月24 日
1实验目的
操作系统是控制和管理计算机硬件和软件资源的虚拟机,其中的文件系统是对软件和设备进行管理的系统,文件系统是操作系统中非常重要的一个模块,它的实现占用了操作系统源码的最大编码量,其好坏也直接影响着用户对操作系统的感受程度。
通过对操作系统课程设计的实践,进一步加深对文件系统的认识和理解,并在此基础上培养学生的工程应用能力。
实验分别从用户态和内核态两个层次实践文件系统的部分功能。
2实验任务
2.1 ls实现
在linux下编程实现带参数的shell命令ls,ls命令必须支持如下功能。
1.基本要求
(1)支持-l 参数;
(2)输出结果按字典排序;
(3)列出“.”文件,支持-a参数,在没有-a时候不显示隐藏文件;
(4)显示记录总数。
2.高级要求
(1)支持对给定的目录进行操作,如ls /tmp;
(2)输出结果分栏排序,每栏的宽度由这一栏最长的文件名决定,显示的栏
数还受终端显示器的宽度影响,每一列尽可能的等宽;
(3)正确显示文件特殊属性suid、sgid和sticky,参见联机帮助确保程序能处
理各种情况;
(4)支持标准的ls支持选项-R,它的功能是递归地列出目录中所有的文件包
含子目录中的文件;
(5)支持标准的ls支持选项-u,它会显示出文件的最后访问时间,如果用了
-u而不用-l,会有什么结果?;
(6)当关掉一个文件的读权限,就不能打开这个文件来读。
如果从一个终端
登录,打开一个文件,保持文件的打开状态,然后从另外的终端登录,去掉文件的读权限,这时有什么事情会发生?编写一个程序,先用open()打开一个文件,用read()读一些内容,调用sleep()等待20s以后,再读一些内容,从另外的终端,再等待的20s内去掉文件的读权限,这样会有什么结果?。
2.2编写内核模块显示目录或文件的信息。
(1)使用内核模块编程;
(2)调试《Linux操作系统原理与应用》第8章文件系统P215 的例子;
(3)练习给内核模块传入参数,参考关于带参数的模块编程
/uid-796091-id-3206153.html;
(4)给内核模块传入参数path,其中path为绝对路径;
1)当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);
2)当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);
3)当路径错误时,有错误提示信息。
3开发环境
4测试环境
5总体设计
5.1功能组织图
对实现的功能模块画出功能组织图,并进行文字说明。
图或表都需编号起名字,具体要求参见《linux操作系统原理与应用教材》。
5.2原理
原理主要说明设计中使用的相关原理。
如对linux解释、对linux下c编程的解释、linux下c编程与windows下c编程的区别、文件系统原理(必须写出与设计程序相关的部分)。
6详细设计
6.1 模块一XXX
1.功能
进行对输入关键字的判断。
3.运行结果
测试结果有显示。
4.模块使用的主要函数、数据类型和宏
(1)主要函数说明
1)函数一
原型;
main(int ac,char *av[])
{
int x=0,j;//x控制传进来参数个数
int sx=0,ss=0;//sx控制sign数组存的信息,ss控制sstring存的信息
if(ac==1) //不带参数查看当前目录。
{
flag=0;
futian_do_ls(".",flag);
}
else
{
for(x=1;x<ac;x++)
if(av[x][0]=='-')
{
strcpy(sign[sx],av[x]);
sx++;
}
else
{
strcpy(sstring[ss],av[x]);
ss++;
}
if(ss==0)//没有目录全是命令
{
strcpy(sstring[ss],".");
ss++;
}
}
if(sx==0)//没有输入命令全是目录
{
flag=0;
for(x=0;x<ss;x++)
{
printf("%s:\n",sstring[x]);
futian_do_ls(sstring[x],flag);
}
}
if(sx==1)//只有一个命令
{
for(x=ss-1;x>=0;x--)
{
name[100]='\0';
t=0;
ftname[100][100]='\0';
printf("%s:\n",sstring[x]);
if(strcmp(sign[0],"-a")==0)
{
flag=1;
futian_do_ls(sstring[x],flag);
}
if(strcmp(sign[0],"-l")==0)
{
flag=2;
futian_do_ls(sstring[x],flag);
}
if(strcmp(sign[0],"-u")==0)
{
flag=4;
futian_do_ls(sstring[x],flag);
}
if(strcmp(sign[0],"-R")==0)
{
flag=7;
futian_do_ls(sstring[x],flag);
}
}
}
}
功能:判断输入是地址还是“-”带参数的命令,如果是带参数的命令,则在根据带的参数的值改变其flag的值。
参数:(int ac,char *av[])
返回值:flag
(2)数据类型
1)数据类型1
;
struct nandt{
char name2[100];
char name1[100];
int time1;
}
名称:nanme2,name1,time1
类型:
name2:char型数组
name1:char型数组
time:int型
含义:
Name2,name1:存放当前文件名
Time1:表示存放的时间
(3)宏
char sign[100][100];//用来处理要处理的-的扩展功能
char sstring[100][100];//用来存放要处理的路径
int ft=0//用来表示文件夹深度
7测试方法与测试结果
7.1测试方法
用测试出的和ls命令进行对比,如果格式一样那么就是正确的。
7.2测试结果
8调试情况,设计技巧及体会
通过本次实验我学会了怎么在main函数中加参数,如何用多个返回值控制不同函数处理。
总的来说很辛苦,不过再辛苦中自己的成就感得到认可,所以做起来还是很有动力的。
9参考资料
书写格式如下:
[1] DANIEL P.BOVET&MARCO CESATI. 深入理解LINUX内核[M]. 陈莉君,张琼声,张宏
伟,译.第三版. 北京:中国电力出版社,2007:825-831.
[3 ]鸟哥. 鸟哥的Linux私房菜[M]. 王世江,改编. 第三版. 北京:人民邮电出版社,
2011:293-399,596-608.
[4] Richard Blum. 汇编语言程序设计[M]. 马朝晖译. 北京:机械工业出版社,2006.
[5] /images/d/d2/Tools-and-technique-for-reducing-bootup-time.pdf
10源程序清单
(纸质打印版课程设计报告不粘贴源程序清单)。