操作系统课程设计实验报告

更新时间:2023-07-25 20:41:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ls命令的实现

西安郵電大學

操作系统课程设计

院系名称学生姓名专业名称班 级学号时

间报 告 书

计算机学院

: : : : : :

ls命令的实现

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编写内核模块显示目录或文件的信息。

ls命令的实现

(1) 使用内核模块编程;

(2) 调试《Linux操作系统原理与应用》第8章文件系统P215 的例子; (3) 练习给内核模块传入参数,参考关于带参数的模块编程/uid-796091-id-3206153.html; (4) 给内核模块传入参数path,其中path为绝对路径;

1) 当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印

的信息);

2) 当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的

信息);

3) 当路径错误时,有错误提示信息。

3 开发环境

开发环境如下表2.3-1:

表2.3-1

4测试环境

ls命令的实现

5总体设计

5.1功能组织图

Ls命令的功能组织图如下图5.1-1:

ls命令的实现

打印内核信息的功能组织图如下图5.1-2:

内核模块传入参数的功能组织图如下图5.1-3:

ls命令的实现

5.2原理

linux解释:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统

linux下c编程与windows下c编程的区别:C标准都是一样的,但是不同的操作系统下有不同的系统API调用,也有不同的编译器!如果只是做简单的练习,不需要调用系统函数的话,是完全一样的,但是在WINDOWS下编译生成的可执行文件在LINUX下是运行不起来的,要在LINUX下运行必须用LINUX下的编译器,比如GCC,这种编译器可以找到WINDOWS版本的,但是编译出来的就在WINDOWS下运行不了!简单说就是不同操作系统下的可执行文件是不能通用的,因为不同的操作系统有不同的进程结构.

文件系统原理:opendir函数的参数为一个绝对路径或者相对路径,返回值为结构体dirent类型的数值或者空值。结构体dirent中包含d_name选项,d_name中是文件名称。Stat函数参数1是文件的绝对路径,参数2是struct stat 结构体的一个参数,ststat("",&info);返回目录的相关信息,st_mode文件类型 st_uid用户(id) st_gid组(id),st_size文件大小 st_nlike文件连接数,st_mtime文件最后修改时间 st_atime最后访问时间,st_ctime文件属性最后改变时间。在<sys/stat.h>有如下定义:

#define S_IFMT 0170000 记录文件的类型#define S_IFREG0100000 regular #define S_IFDIR 0040000directory #define S_IBLK 0060000特殊块 #define S_IFCHR 0020000字符块 #define S_IFIFO 0010000 fifo #define S_IFLNK 0120000文件连接数 #define S_IFSOCK 0140000通道 if(S_ISDIR(mode)) str[0] = 'd';是设备if(S_ISCHR(mode)) str[0] = 'c';字符设备if(S_ISDIR(mode)) str[0] = 'b';块设备if(S_IRUSR & mode) str[1] = 'r';可读if(S_IWUSR & mode) str[2] = 'w';可写if(S_IXUSR & mode) str[5] = 'w';可写if(S_IXGRP & mode) str[6] = 'x'; 可执行if(S_IROTH & mode) str[7] = 'r';可读 if(S_IWOTH & mode) str[8] = 'w';可写if(S_IXOTH & mode) str[9] = 'x';可执行。Struct passwd 结构体中pw_name 用户名,pw_passwd用户密码,pw_uid用户id,pw_gid 组id,pw_gecos真是名称pw_dir用户目录pw_shell shell命令。

mode)

str[3] = 'x';可执行if(S_IRGRP & mode) str[4] = 'r';可读 if(S_IWGRP &

ls命令的实现

6详细设计

6.1.1模块一ls命令实现 1.功能

①ls -l:每个文件单独占一行,显示文件的详细属性信息 ②ls -a:显示包括隐藏文件在内的所有文件 ③ls -u:显示出文件的最后访问时间 ④ls:显示的文件名按字典顺序排序 ⑤ls /指定目录:显示当前目录下的内容

⑥ls -lu:每个文件单独占一行,显示文件的详细属性信息,并且显示出文件的 最后访问时间

⑦ls -la:显示包括隐藏文件在内的所有文件的详细属性信息

⑧ls -lua:显示包括隐藏文件在内的所有文件的详细属性信息,并且显示出文 件的最后访问时间

⑨chmod 权限 文件名:修改文件的权限,并且显示出此文件是否受suid,sgid 和sticky的控制

⑩chmod 权限(3位) 在一终端运行程序,读取文件信息,在另一终端修改文 件权限,看结果。

6.1.2模块一ls命令实现

①编写内核模块,打印super_block结构中一些域的值。(课本上的例子)遍历系统中的超级块:list_head结构类型的字段名称为s_list。list_entry宏通过指向list_head节点的地址来得到外部超级块的首地址。获取系统中个超级块的地址,获得某个子进程的地址,打印文件系统所在的主设备号和次设备号和文件系统名。遍历打印每个超级块中的所有索引节点号,打印索引结点。

②给内核模块传入参数path,其中path为绝对路径 path=路径时,显示如下信息:

1.哈希表 2.目录项名 3.短目录名 4.目录项标志 5.目录项长度

6.目录项计数器的引用

path=文件时,显示如下信息:

1.版本号 2.用户组ID 3.用户ID 4.硬链接数 5.引用记数 6.文件大小 7.文件的块数 8.文件类型和权限 9.索引节点的状态

10.以位为单位的块大小

ls命令的实现

11.文件索引节点的数量

12.指定文件系统的读写访问标志

2.算法/流程图

实现ls命令功能流程图如下:

ls命令的实现

内核模块:打印super_block结构中的一些域的值。

给内核模块传入参数path流程图,其中path为绝对路径;当path为目录时,显示目录对应的dentrey结构中的相关信息;当path为文件时,显示文件对应的indoe结构中的相关信息;当路径错误时,有错误提示信息。

ls命令的实现

开始输的 是入目录

输入是 的目录是否

误错打 印denteyr结构 信体息打 印edntrey结构 信息体打印错信误息

束结

ls命令的实现

3.运行结果 (一)ls

ls -l(1):

ls -l

以长格式的形式查看当前目录下所有文件

ls -a(2):

ls -a将隐藏文件显示出来,并按照字典进行排序

ls -R(3):

ls -R递归地列出目录中所有的文件包含子目录中的文件

ls -u(4):

ls -u根据文件最后显示时间列出

对给定目录进行操作: 1)如

./ls /tmp(5)

2)对绝对路径目录进行操作:./ls /home/weiyue/linux(6)

ls命令的实现

3)对相对路径目录进行操作:

./ls ../linux(7)

读权限:

1)先显示正常情况下:

(8)

2)再执行一次,

然后在另外一个终端里修改文件的权限:

chmod 000 abc.txt(9)

然后观察结果:

再执行一次,观察结果:(11)

(二)内核测试结果:

1)调试P215,观察数据结构中的数据:(12)

ls命令的实现

进行内核操作时要在root权限下

2)给内核模块传入参数path,其中path为绝对路径:

1.当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);

2.当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);

3.当路径错误时,有错误提示信息

ls命令的实现

4.模块使用的主要函数、数据类型和宏 (1)主要函数说明 1)函数do_ls();

原型;void do_ls(char dirname[],int choose,int abcd)

功能:输出当前目录,或者指定目录(默认当前目录)的所有文件的信息,

结果按字典排序。先按文件名称长度排序,相等长度的名称的按字典排 序,无论中文名称的长度是多少,统一排在最后一个英文名称的文件后 面,中文名称的文件名称按长度排序,相等长度的按字典排序。

参数:char dirname[],含有文件名称的字符串,abcd,选项选择输出详细

信息或不输出相信信息

ls命令的实现

返回值:void

2)函数do_ls();

原型:void do_ls(char *);

功能:根据参数进行ls命令功能实现 返回值:void

3)函数file_info( );

原型:void file_info( char *filename, struct stat *info_p ) 功能:输出文件的信息:分配给文件的超级块的节点号,访问控制权限

引用计数,硬链接数使用者ID,使用者组ID,版本号,以字节为单位

4)函数qsort();

原型;qsort(filename,i,sizeof(filename[0]),cmp);

功能:根据cmp函数比较filename中所有名称,返回有序的名称数组。 参数:filename名称数组,i数组的个数,sizeof(filename[0]),数组单

元的大小,cmp用于比较函数的的函数。 返回值:void

的文件大小,文件块数,状态标志 返回值:void

7测试方法与测试结果

7.1测试方法以及测试结果

单元测试:

ls命令的实现

课程设计要求确认测试:

ls命令的实现

8调试情况,设计技巧及体会

在本次为期两周的课设中,我们完成了通过自己编码实现ls的功能,并

且可以带部分参数(-l,-a,-R,-u),以及部分内核态的操作,可以给内核模块传入参数path。

设计过程中,要先对代码架构进行构思,然后用结构化分析方法进行分

析,将ls命令系统清楚的划分为几个模块,再根据每个模块的功能编写代码。而且尽可能的将模块细分,最后在进行函数的调用。在函数的编写过程中,不仅用到了很多系统的结构体,还用到了函数之间的调用(包括递归调用)。只要将每个模块都认真做好,都会很很大的收获。

之前已经学习linux的一些东西,但是我所学的知识最多也就是在做作

业的时候才会用到,很少实现系统一级的代码,平时没有什么练习的机会,这次的课程设计通过自己构思,和同学讨论并且不断查阅资料来设计一项程序。这次设计,不仅巩固了我以前所学的知识,还让我对系统调用有了更深一步的了解,掌握了更多的技巧和技能。

虽然两周的时间很短短,但是收获却是满满的。希望以后在学习过程中,

多加练习,争取更大的进步。

9参考资料

[1] DANIEL P.BOVET&MARCO CESATI. 深入理解LINUX内核[M]. 陈莉君,张琼声,张宏

伟,译.第三版. 北京:中国电力出版社,2007:825-831. 出版社,2011:293-399,596-608.

[2]unix、linux编程实战教程. BruceMolay著,杨海源,黄海涛译 北京:清华大学

源程序清单

本文来源:https://www.bwwdw.com/article/tqem.html

Top