您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Linux下ls命令的实现
1《Linux环境程序设计》大作业报告题目:Linux下ls命令的实现学院物联网工程学院专业计算机科学与技术班级计科1105班学号03041105学生姓名二〇一四年十二月《Linux环境程序设计》大作业报告1目录一、设计思想................................................................................................................21.1实验要求..........................................................................................................21.2设计思路..........................................................................................................2二、数据定义、系统(函数)调用、处理流程........................................................22.1数据定义..........................................................................................................22.1.1DIR结构体..........................................................................................22.1.2dirent结构体.......................................................................................32.1.3stat结构体...........................................................................................32.2系统调用..........................................................................................................42.2.1opendir函数........................................................................................42.2.2readdir函数.........................................................................................42.2.3closedir函数........................................................................................52.3处理流程..........................................................................................................5三、详细设计(含源程序)........................................................................................6四、运行结果与分析..................................................................................................11五、设计体会..............................................................................................................14六、参考文献..............................................................................................................14《Linux环境程序设计》大作业报告2一、设计思想1.1实验要求使用opendir、readdir、closedir等函数来操作目录,利用stat函数来获取文件信息。编写一个功能完整的实现Linux下ls命令的程序,该程序实现了-l、-i、-t这几个选项的功能。其中,-l、-i、-t选项说明:-l:usealonglistingformat.-i:printtheindexnumberofeachfile.-t:sortbymodificationtime,newestfirst.1.2设计思路本实验是实现Linux下的ls功能。其设计思路如下:目的是获取某目录下文件的详细信息。(1)首先使用opendir()函数打开目录,返回指向该目录的DIR结构体。(2)接着,调用readdir()函数读取这个目录下所有文件,其中应该包括目录本身,返回指向该目录下所有文件的dirent结构体。(3)最后,遍历dirent结构体,调用stat来获取每个文件的详细信息并存储在stat结构体中。如果这个参数是一个文件名,我们输出这个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和修改时间。使用一个数组flags[4]来标记输入的命令是-l、-i、-t还是空(没有输入命令)。当选择-l功能时,是以长列表方式显示,即显示详细信息;当选择-i功能时,是显示每一个文件在系统里的文件号;当选择-t功能时,是按修改时间来排序,以最新的修改时间来输出。二、数据定义、系统(函数)调用、处理流程2.1数据定义2.1.1DIR结构体该结构体包含在头文件#includedirent.h中,其定义如下:struct__dirstream{void*__fd;char*__data;《Linux环境程序设计》大作业报告3int__entry_data;char*__ptr;int__entry_ptr;size_t__allocation;size_t__size;__libc_lock_define(,__lock)};typedefstruct__dirstreamDIR;DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息。函数DIR*opendir(constchar*pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:structdirent*readdir(DIR*dp);voidrewinddir(DIR*dp);intclosedir(DIR*dp);longtelldir(DIR*dp);voidseekdir(DIR*dp,longloc);2.1.2dirent结构体对于dirent结构体,首先我们要弄清楚目录文件(directoryfile)的概念。这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件。以下为dirent结构体的定义:structdirent{longd_ino;/*inodenumber索引节点号*/off_td_off;/*offsettothisdirent在目录文件中的偏移*/unsignedshortd_reclen;/*lengthofthisd_name文件名长*/unsignedchard_type;/*thetypeofd_name文件类型*/chard_name[NAME_MAX+1];/*filename(null-terminated)文件名,最长255字符*/}从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用。2.1.3stat结构体如果想获得类似ls-l那种效果的文件信息,必须要靠stat函数了。通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数intstat(constchar*file_name,structstat*buf);的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:structstat{《Linux环境程序设计》大作业报告4mode_tst_mode;//文件访问权限ino_tst_ino;//索引节点号dev_tst_dev;//文件使用的设备号dev_tst_rdev;//设备文件的设备号nlink_tst_nlink;//文件的硬连接数uid_tst_uid;//所有者用户识别号gid_tst_gid;//组识别号off_tst_size;//以字节为单位的文件容量time_tst_atime;//最后一次访问该文件的时间time_tst_mtime;//最后一次修改该文件的时间time_tst_ctime;//最后一次改变该文件状态的时间blksize_tst_blksize;//包含该文件的磁盘块的大小blkcnt_tst_blocks;//该文件所占的磁盘块};2.2系统调用2.2.1opendir函数该函数的功能是打开目录。相关函数open,readdir,closedir,rewinddir,seekdir,telldir,scandir表头文件#includesys/types.h#includedirent.h定义函数DIR*opendir(constchar*name);函数说明opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。返回值如果成功则返回DIR*型态的目录流,如果打开失败则返回NULL。2.2.2readdir函数该函数的功能是读取目录。相关函数open,opendir,closedir,rewinddir,seekdir,telldir,scandir表头文件#includesys/types.h#includedirent.h定义函数structdirent*readdir(DIR*dir);函数说明readdir()返回参数dir目录流的下个目录进入点。返回值成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返《Linux环境程序设计》大作业报告5回NULL。附加说明EBADF参数dir为无效的目录流。2.2.3closedir函数该函数的功能是关闭目录。相关函数opendir表头文件#includesys/types.h#includedirent.h定义函数intclosedir(DIR*dir);函数说明closedir()关闭参数dir所指的目录流。返回值如果关闭成功则返回0,如果失败返回-1,错误原因存于errno中。2.3处理流程开始opendir()打开目录DIR结构体readdir()读取目录下文件dirent结构体stat获取每个文件详细信息并存储是否为文件输出大小和最后修改时间输出目录下所有文件的大小和修改时间结束是否《Linux环境程序设计》大作业报告6三、详细设计(含源程序)本实验是实现Linux下的ls功能。首先设置标志,判断输入的命令。如果是普通文件,则递归输出文件的相关信息,如文件的大小和最
本文标题:Linux下ls命令的实现
链接地址:https://www.777doc.com/doc-2884663 .html