西安郵電學/uid-796091-id-3206153.html;
给内核模块传入参数path,其中path为绝对路径;
当path为目录时,显示目录对应的dentrey结构中的相关信息(可打印的信息);
当path为文件时,显示文件对应的indoe结构中的相关信息(可打印的信息);
当路径错误时,有错误提示信息。
开发环境
设备名称设备类型配置类型参数Lenovo PC机硬件配置软件配置
测试环境
设备名称设备类型配置类型参数LenovoPC机硬件配置软件配置
总体设计
5.1功能组织图
ls 功能图:
文件权限:
内核模块:
super_blocks:
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-l filename 来查看一文件的属性。其中第一项文件属性总共由10位构成,第一位是文件类型,剩下9位都是表示文件的访问权限,每3个一组,第一组:文件所有者对该文件的操作权限,第二组表示与文件所有者同组的用户对该文件的操作权限,第三组表示其他用户对该文件的操作权限,权限由三种字母组成:r:可读w:可写x:可执行。
编写内核模块
写内核模块,打印super_block结构中一些域的值。(课本上的例子)
遍历系统中的超级块:list_head结构类型的字段名称为s_list。list_entry宏通过指向list_head节点的地址来得到外部超级块的首地址。获取系统中个超级块的地址,获得某个子进程的地址,打印文件系统所在的主设备号和次设备号和文件系统名。遍历打印每个超级块中的所有索引节点号,打印索引结点。
内核模块传入参数path,其中path为绝对路径
path=路径时,显示如下信息:
目录项标志、哈希表、短目录名、目录项长度、目录项名、目录项计数器的引用
path=文件时,显示如下信息:
文件索引节点的数量、文件类型和权限、用户ID、用户组ID、指定文件系统的读写访问标志、文件大小、索引节点的状态、硬链接数、引用记数、文件的块、版本号、以位为单位的块大小
详细设计
模块一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()函数:
否
是
否
是
否
是
否