西安邮电大学linux操作系统课程设计ls的编写含源码.docx
- 文档编号:3270688
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:37
- 大小:3.05MB
西安邮电大学linux操作系统课程设计ls的编写含源码.docx
《西安邮电大学linux操作系统课程设计ls的编写含源码.docx》由会员分享,可在线阅读,更多相关《西安邮电大学linux操作系统课程设计ls的编写含源码.docx(37页珍藏版)》请在冰豆网上搜索。
西安邮电大学linux操作系统课程设计ls的编写含源码
西安郵電大學
操作系统课程设计
报告书
院系名称
:
计算机学院
学生姓名
:
专业名称
:
软件工程
班级
:
班
学号
:
时间
:
2015年4月13日至2015年4月24日
1实验目的
操作系统是控制和管理计算机硬件和软件资源的虚拟机,其中的文件系统是对软件和设备进行管理的系统,文件系统是操作系统中非常重要的一个模块,它的实现占用了操作系统源码的最大编码量,其好坏也直接影响着用户对操作系统的感受程度。
通过对操作系统课程设计的实践,进一步加深对文件系统的认识和理解,并在此基础上培养学生的工程应用能力。
实验分别从用户态和内核态两个层次实践文件系统的部分功能。
2实验任务
2.1ls实现
在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)练习给内核模块传入参数,参考关于带参数的模块编程
(4)给内核模块传入参数path,其中path为绝对路径;
1)当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);
2)当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);
3)当路径错误时,有错误提示信息。
3开发环境
设备名称
设备类型
配置类型
参数
Lenovo
G480
PC机
硬件配置
RAM4G
软件配置
Ubuntu32位
4测试环境
设备名称
设备类型
配置类型
参数
Lenovo
G480
PC机
硬件配置
RAM4G
软件配置
Ubuntu32位
5总体设计
5.1功能组织图
ls功能图:
运行命令
Ls
-a
Ls
Ls
-l
Ls
-la
添加/temp(指定目录)
输出所有文件属性
输出隐藏文件
输出文件属性
按字典顺序排序
文件权限:
运行命令
chmod修改权限
读文件,ls显示权限信息
内核模块:
super_blocks:
运行命令
加载模块
加锁
遍历系统中的超级块
打印文件设备号
打印文件系统名
打印索引结点号统计索引结点计数
卸载模块
path:
运行命令
路径错误
Path=文件
Path=目录
显示目录信息
显示错误信息
显示文件信息
5.2原理
linux 文件系统 :
linux下有普通文件、目录文件、链接文件、设备文件、管道文件这几种类型。
但链接文件、设备文件、管道文件都可以当做普通文件看待,那实际也就只要区分普通文件和目录文件这两种了。
而目录文件的内容就是它所包含所有文件和子目录的一个列表,所以只要打开目录文件并读取对应目录块里的那个列表数据,就可以得到些目录下所有文件和子目录的名称了。
其实这个流程简单,就是:
打开目录->读取内容->显示文件名称->关闭打开的目录。
Linux系统中会有很多目录。
每个目录中又会有很多文件。
如果要列出一个非当前目录的内容或者是一个特定文件的信息,则需要在参数中给出目录名或文件名。
如:
ls /tmp //列出/tmp目录中各文件的文件名
ls – docs //列出docs目录中各文件的属性
ls *.c //列出当前目录下与*.c匹配的文件,即当前目录下所有以.c为后缀的 经常用到的命令行选项
ls -l 在前面已经提到过,-l就是输出文件详细的信息
ls -a 列出的内容包含以“.“开头的文件,即所谓有隐藏文件
Linux的文件访问权限:
Linux是一个安全的操作系统,说他安全,最重要的一个原因是对用户访问权限的控制。
在shell下我们可以通过命令ls-lfilename来查看一文件的属性。
其中第一项文件属性总共由10位构成,第一位是文件类型,剩下9位都是表示文件的访问权限,每3个一组,第一组:
文件所有者对该文件的操作权限,第二组表示与文件所有者同组的用户对该文件的操作权限,第三组表示其他用户对该文件的操作权限,权限由三种字母组成:
r:
可读w:
可写x:
可执行。
编写内核模块
1写内核模块,打印super_block结构中一些域的值。
(课本上的例子)
遍历系统中的超级块:
list_head结构类型的字段名称为s_list。
list_entry宏通过指向list_head节点的地址来得到外部超级块的首地址。
获取系统中个超级块的地址,获得某个子进程的地址,打印文件系统所在的主设备号和次设备号和文件系统名。
遍历打印每个超级块中的所有索引节点号,打印索引结点。
2内核模块传入参数path,其中path为绝对路径
path=路径时,显示如下信息:
目录项标志、哈希表、短目录名、目录项长度、目录项名、目录项计数器的引用
path=文件时,显示如下信息:
文件索引节点的数量、文件类型和权限、用户ID、用户组ID、指定文件系统的读写访问标志、文件大小、索引节点的状态、硬链接数、引用记数、文件的块、版本号、以位为单位的块大小
6详细设计
6.1模块一ls
1.功能
(1)ls支持-l参数;
(2)输出结果按字典排序;
(3)列出“.”文件,支持-a参数,在没有-a时候不显示隐藏文件;
(4)显示记录总数。
(5)支持对给定的目录进行操作,如ls/tmp;
(6)输出结果分栏排序,每栏的宽度由这一栏最长的文件名决定,显示的栏数还受终端显示器的宽度影响,每一列尽可能的等宽;
(7)修改文件权限
2.算法/流程图
ls算法描述:
用parameter[20]保存命令行参数的值,用path[PATH_MAX+1]保存文件的路径名;程序运行时,先将命令参数保存下来,并给flag_parameter赋相应的值,再判断文件路径是否存在,不存在则代表当前目录,将./赋值给path,若存在,则根据文件路径判断是文件还是目录,若是文件,就根据flag_parameter和path调用Output_parameter()函数,输出该文件的属性;若是目录,就将正确的目录名保存到path;最后根据flag_parameter和path调用Output_dir()函数,列出目录下所有文件的属性。
流程图:
main()函数:
开始
parameter[20]保存命令行参数的值
给flag_parameter赋相应的值
判断是否有文件路径
否
给path赋值为./
是
文件路径名保存在path中
判断文件路径是否存在
否
是
判断文件路径是目录
否
是
调用Output_dir(flag_parameter,path);
判断文件路径是文件
否
是
调用Output_parameter(flag_parameter,path);
结束
Output_file_attribute():
开始
给str赋值”---------”
判断文件的类型,给str[0]赋值对应的字母
判断用户的权限,给str[1]~[3]赋值
判断组的权限,给str[4]~[6]赋值
判断其他用户的权限,给str[7]~[9]赋值
输出str[10]的内容
输出文件的各种属性
文件个数加一
结束
Output_parameter():
开始
文件个数加一
从路径中解析出文件名
Lstat解析链接文件
否
是
flag_parameter==PARAMETER_N
调用Output()
Name[0]==’.’
是是
否
否
flag_parameter==PARAMETER_A
调用Output()
是
否
flag_parameter==PARAMETER_L
调用Output_file_attribute()
Name[0]==’.’
是是
否
否
flag_parameter==PARAMETER_A_L
调用Output_file_attribute()
是
否
结束
Output():
开始
本行剩余长度<文件名长度
否
是
换行,给剩余长度赋最大值
打印文件名
文件个数加一
结束
3.运行结果
4.模块使用的主要函数、数据类型和宏
(1)主要函数说明
1)函数一Output_file_attribute
原型:
Output_file_attribute(structstatbuf,char*name)
功能:
根据文件名输出文件的各种属性
参数:
buf,name
返回值:
void
2)函数二Output
原型:
Output(char*name)
功能:
将文件名分栏排序
参数:
name
返回值:
void
3)函数三Output_parameter
原型:
Output_parameter(intflag,char*pathname)
功能:
根据命令行参数和完整路径名按要求显示目标文件
参数:
flag,pathname
返回值:
void
4)函数四Output_dir
原型:
Output_dir(intflag_parameter,char*path)
功能:
根据命令行参数和目录路径名将目录下的文件按要求显示出来
参数:
flag_parameter,path
返回值:
void
(2)数据类型
1)数据类型1
名称:
num
类型:
int
含义:
保存命令参数行-的个数
2)数据类型2
名称:
path[PATH_MAX+1]
类型:
char
含义:
保存文件路径名
3)数据类型3
名称:
parameter[20]
类型:
char
含义:
保存命令行参数
4)数据类型4
名称:
flag_parameter
类型:
int
含义:
记录命令行参数的种类
5)数据类型5
名称:
buf
类型:
structstat
含义:
保存文件信息
(3)宏1
名称:
#definePARAMETER_N0
含义:
命令行无参数
宏2
名称:
#definePARAMETER_A1
含义:
命令行参数只有-a
宏3
名称:
#definePARAMETER_L2
含义:
命令行参数只有-l
宏4
名称:
#definePARAMETER_A_L3
含义:
命令行参数有-a和-l
宏5
名称:
#defineMAXROWLEN80
含义:
一行显示的最多字符数,用于分栏排序
6.2模块二read
1.功能
打开文件,修改文件权限后读取文件内容
2.算法/流程图
算法:
定义一个空指针buf用来存放动态申请内存空间的地址,定义一个整型变量file用来存放文件描述符;用open()函数已只读的方式打开指定的文件,返回的文件描述符赋给file;若文件打开成功,就休眠20秒,在这20秒期间,通过chmod命令改变文件的读写权限;然后根据file的值来读取文件中的字符,存放在buf,再输出buf,若读取失败就退出。
流程图:
开始
定义buf,file变量
buf=malloc(30);
file=open("read.txt",O_RDONLY);
file==-1
是
否
休眠20s,chmod修改文件权限
(read(file,buf,30))==-1
是
否
输出buf的内容
结束
3.运行结果
4.模块使用的主要函数、数据类型和宏
(1)主要函数说明
1)函数一main
原型:
voidmain()
功能:
打开文件
参数:
无
返回值:
无
(2)数据类型
1)数据类型1
名称:
buf
类型:
void*
含义:
定义一个空指针,用来指向动态申请的内存地址
2)数据类型2
名称:
file
类型:
int
含义:
用来存放打开文件的文件描述符
(3)宏:
无
6.3模块三super_block
1.功能
通过加载内核的方式,打印出超级块super_blocks数据结构中文件系统所在的主设备号和次设备号以及文件系统名
2.算法/流程图
开始
加载模块
加锁
遍历系统中的超级块
打印文件设备号
打印文件系统名
打印索引结点号
索引结点计数
卸载模块
结束
3.运行结果
4.模块使用的主要函数、数据类型和宏
(1)主要函数说明
1)函数一
原型:
staticint__initmy_init(void)
功能:
模块加载
参数:
无
返回值:
int
2)函数二
原型:
staticvoid__exitmy_exit(void)
功能:
模块卸载
参数:
void
返回值:
void
(2)数据类型
1)数据类型1
名称:
sb
类型:
structsuper_block*
含义:
定义一个超级块
2)数据类型2
名称:
pos
类型:
structlist_head*
含义:
定义一个链表
3)数据类型3
名称:
linode
类型:
structlist_head*
含义:
定义一个链表
4)数据类型4
名称:
pinode
类型:
structinode*
含义:
定义一个索引结点
5)数据类型5
名称:
count
类型:
int
含义:
存储总数
(3)宏一
名称:
#defineSUPER_BLOCKS_ADDRESS0xc1778bc0
含义:
超级块的变量地址
宏二
名称:
#defineSB_LOCK_ADDRESS0xc1932aa0
含义:
sb_lock超级块对应的自旋锁
6.4模块四path
1.功能
给内核模块传入参数path,其中path为绝对路径;
1)当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);
2)当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);
3)当路径错误时,有错误提示信息。
2.算法/流程图
开始
加载模块
调用open()
卸载模块
结束
开始
open()函数:
打开文件
是文件
否
调用file_put()打印文件信息
是
调用dir()打印目录信息
关闭文件
结束
3.运行结果
4.模块使用的主要函数、数据类型和宏
(1)主要函数说明
1)函数一
原型:
staticintfile_put(void)
功能:
打印文件信息
参数:
void
返回值:
int
2)函数二
原型:
staticintdir(void)
功能:
打印目录信息
参数:
void
返回值:
int
3)函数三
原型:
staticintopen(char*path)
功能:
打开文件
参数:
char*path
返回值:
int
4)函数四
原型:
staticintparam_init(void)
功能:
加载模块
参数:
void
返回值:
int
5)函数五
原型:
staticvoidparam_exit(void)
功能:
模块卸载
参数:
void
返回值:
void
(2)数据类型
1)数据类型1
名称:
file
类型:
structfile*
含义:
定义一个文件
2)数据类型2
名称:
inode
类型:
structinode*
含义:
定义一个索引结点
3)数据类型3
名称:
dent
类型:
structdentry*
含义:
4)数据类型4
名称:
path_file
类型:
staticchar*
含义:
定义一个字符串存放输入文件名
(3)宏:
无
7测试方法与测试结果
7.1测试方法
编号
输入用例
期望结果
1
./ls
按字典排序,输出当前目录下的所有文件名(不含隐藏文件)
2
./ls-lls.c
显示ls.c文件的详细信息
3
./ls-a../python
显示上级目录下python目录的所有文件名,含有隐藏文件。
4
./ls-l.
显示当前目录下的非隐藏文件详细信息按字典排序
5
./ls-al../shell
显示上层文件夹下所有文件文件的详细信息
6
./lsabc
显示ERROR:
当前文件夹下没有该文件
7.2测试结果
1../ls
2../ls–lls.c
3../ls–a../python
4../ls–l../pyhon
5../ls–al../shell
6../lsabc
8调试情况,设计技巧及体会
在设计过程中,在编写多个命令参数时遇到了困难,由于在程序整个过程中都需要根据命令参数打印记录文件,因此设定了一个数组用来存储命令行参数,考虑到全局参数不安全,因此选择使用函数的形参来传递。
,通过这次课程设计,不仅使我对ls命令有了更深一层的认识,还认识到了系统提供的命令实现的途径和方法。
之前总是使用系统命令,如今自己编程实现了一些命令,每次使用系统提供的命令和调用自己编写的命令感觉大不相同。
对同时对内核模块的编程也更加熟悉了。
在做设计时先要理清思路,设计好功能模块之间的关系,再一步一步编码实现。
9参考资料
[1]DANIELP.BOVET&MARCOCESATI.深入理解LINUX内核[M].陈莉君,张琼声,张宏伟,译.第三版.北京:
中国电力出版社,2007:
825-831.
[2]Documentation/x86/boot.txt
[4]RichardBlum.汇编语言程序设计[M].马朝晖译.北京:
机械工业出版社,2006.
[5]http:
//elinux.org/images/d/d2/Tools-and-technique-for-reducing-bootup-time.pdf
10源程序清单
Ls.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#definePARAMETER_N0//无参数
#definePARAMETER_A1//-a:
显示所有文件
#definePARAMETER_L2//-l:
一行显示一个文件的详细信息
#definePARAMETER_A_L3//-a-l或-la或-al显示所有文件的详细信息
#defineMAXROWLEN80//一行显示的最多字符数
intcnt=0;//显示文件的总个数
intleave_len=MAXROWLEN;//一行剩余长度,用于输出对齐
intmaxlen;//存放某目录下最长文件名的长度
voidOutput_file_attribute(structstatbuf,char*name);//打印文件属性
voidOutput(char*name);//只输出文件名,命令没有-l选项,文件名时要保持上下文对齐
voidOutput_parameter(intflag,char*pathname);//根据命令行参数和文件路径名显示目标文件
voidOutput_dir(intflag_parameter,char*path);//显示目录下的文件
intmain(intargc,char**argv)
{
inti,j,k,num;
charpath[PATH_MAX+1];//文件路径名
charparameter[20];//保存命令行参数-a-l
intflag_parameter=PARAMETER_N;//用来记录参数种类
structstatbuf;
j=0;
num=0;
for(i=1;i { if(argv[i][0]=='-') { for(k=1;k { parameter[j]=argv[i][k];//获取-后面的参数保存到数组parameter中 j++; } num++;//保存"-"的个数 } } //记录参数,最后为选项数组的末尾元素赋‘\0’。 for(i=0;i { if(parameter[i]=='a') { flag_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 邮电大学 linux 操作系统 课程设计 ls 编写 源码