ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:693.82KB ,
资源ID:3310306      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3310306.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Linux下ls命令的实现解析.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Linux下ls命令的实现解析.docx

1、Linux下ls命令的实现解析Linux环境程序设计大作业报告题目: Linux下ls命令的实现 学 院 物联网工程学院 专 业计算机科学与技术 班 级 计科1105班 学 号 03041105 学生姓名 二一四年十二月目录一、设计思想 21.1 实验要求 21.2 设计思路 2二、数据定义、系统(函数)调用、处理流程 22.1 数据定义 22.1.1 DIR结构体 22.1.2 dirent结构体 32.1.3 stat结构体 32.2 系统调用 42.2.1 opendir函数 42.2.2 readdir函数 42.2.3 closedir函数 52.3 处理流程 5三、详细设计(含源程

2、序) 6四、运行结果与分析 11五、设计体会 14六、参考文献 14一、设计思想1.1 实验要求 使用opendir、readdir、closedir等函数来操作目录,利用stat函数来获取文件信息。编写一个功能完整的实现Linux下ls命令的程序,该程序实现了-l、-i、-t这几个选项的功能。其中,-l、-i、-t选项说明: -l:use a long listing format.-i:print the index number of each file. -t:sort by modification time, newest first.1.2 设计思路 本实验是实现Linux下的l

3、s功能。其设计思路如下:目的是获取某目录下文件的详细信息。(1)首先使用opendir()函数打开目录,返回指向该目录的DIR结构体。(2)接着,调用readdir()函数读取这个目录下所有文件,其中应该包括目录本身,返回指向该目录下所有文件的dirent结构体。(3)最后,遍历dirent结构体,调用stat来获取每个文件的详细信息并存储在stat结构体中。 如果这个参数是一个文件名,我们输出这个文件的大小和最后修改的时间,如果是一个目录我们输出这个目录下所有文件的大小和修改时间。使用一个数组flags4来标记输入的命令是-l、-i、-t还是空(没有输入命令)。当选择-l功能时,是以长列表方

4、式显示,即显示详细信息;当选择-i功能时,是显示每一个文件在系统里的文件号;当选择-t功能时,是按修改时间来排序,以最新的修改时间来输出。二、数据定义、系统(函数)调用、处理流程2.1 数据定义2.1.1 DIR结构体 该结构体包含在头文件#include 中,其定义如下:struct _dirstream void*_fd; char*_data;int _entry_data; char*_ptr;int _entry_ptr; size_t _allocation; size_t _size; _libc_lock_define(,_lock);typedef struct _dirst

5、ream DIR; DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:structdirent*readdir(DIR*dp);voidrewinddir(DIR*dp);intclosedir(DIR*dp);longtelldir(DIR*dp);voidseekdir(DIR*dp,long loc);2.1.2 dirent结构体 对于dirent结构体,首先我们要弄清楚目录文件

6、(directory file)的概念。这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件。以下为dirent结构体的定义:struct direntlong d_ino; /*inode number 索引节点号*/off_td_off; /*offsettothis dirent 在目录文件中的偏移*/unsigned shortd_reclen;/*length of this d_name文件名长*/unsigned char d_type; /*the type

7、of d_name文件类型*/char d_nameNAME_MAX+1;/*file name(null-terminated)文件名,最长255字符*/ 从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用。2.1.3 stat结构体 如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数int stat(const char *file_name, struct stat *buf);的作用就是获取文件名为d_name的文件的详细

8、信息,存储在stat结构体中。以下为stat结构体的定义:structstat mode_t st_mode; /文件访问权限ino_t st_ino; /索引节点号dev_t st_dev; /文件使用的设备号dev_t st_rdev; /设备文件的设备号nlink_t st_nlink; /文件的硬连接数uid_t st_uid; /所有者用户识别号gid_t st_gid; /组识别号off_t st_size; /以字节为单位的文件容量time_t st_atime; /最后一次访问该文件的时间time_t st_mtime; /最后一次修改该文件的时间time_t st_ctime

9、; /最后一次改变该文件状态的时间blksize_t st_blksize;/包含该文件的磁盘块的大小blkcnt_t st_blocks; /该文件所占的磁盘块;2.2 系统调用2.2.1 opendir函数 该函数的功能是打开目录。相关函数open,readdir,closedir,rewinddir,seekdir,telldir,scandir表头文件#include#include定义函数DIR * opendir(const char * name);函数说明opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都

10、要使用此返回值。返回值如果成功则返回DIR* 型态的目录流,如果打开失败则返回NULL。2.2.2 readdir函数 该函数的功能是读取目录。相关函数open,opendir,closedir,rewinddir,seekdir,telldir,scandir表头文件#include#include定义函数struct dirent * readdir(DIR * dir);函数说明readdir()返回参数dir目录流的下个目录进入点。返回值成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。附加说明EBADF参数dir为无效的目录流。2.2.3 closedir函数 该

11、函数的功能是关闭目录。相关函数opendir表头文件#include#include定义函数int closedir(DIR *dir);函数说明closedir()关闭参数dir所指的目录流。返回值如果关闭成功则返回0,如果失败返回-1,错误原因存于errno 中。2.3 处理流程否是三、详细设计(含源程序) 本实验是实现Linux下的ls功能。首先设置标志,判断输入的命令。如果是普通文件,则递归输出文件的相关信息,如文件的大小和最后修改时间。如果是目录,则输出该目录下的所有文件和非正常文件的大小以及修改时间。普通文件使用S_ISREG()函数,而目录文件使用S_ISDIR()函数。源代码如

12、下:/*Linux下的ls功能实现计科1105班 颜潇雨*/#include #include #include #include #include #include #include #include #include #include #include static bool flags4; /标志,选项设定全局变量,用来确定是-l,-t还是-iint myls(char *s, bool flag);void lprint(char* fname);/*main函数入口*/int main(int argc, char *argv) char c; int i; while (c = g

13、etopt(argc, argv, alidtFR) != -1) /获取命令行输入的选项参数 switch (c) case l:flags0 = 1; break; case i:flags1 = 1; break; case t:flags2 = 1; break; default:return -1; if (argc = optind) /命令行没有输入目录参数,设定函数目录参数为当前目录 myls(., flags); else for (i = optind; i argc; i+) /依序对输入的所有目录参数进行myls函数操作 myls(argvi, flags); retu

14、rn 0;/*myls函数,调用lprint函数进行-l格式输出*/int myls(char *s, bool flag) struct stat buf, statbuf, tmps; struct stat sort256; char *t; char fname256, tmpn256, sfname256; char sname256256; DIR *dir; struct dirent *pd; int num, i, j; if (lstat(s, &buf) d_name0 = .) | (pd-d_name0 != .) memset(fname, 0, 256); str

15、cpy(fname, s); strcat(fname, /); strcat(fname, pd-d_name); lstat(fname, &sortnum); /读取文件信息到缓存数组sort中 strcpy(snamenum, pd-d_name); /保存文件名到缓存数组sname中 num+; /*将sort存储的文件信息进行排序*/ for (i = 0; i num - 1; i+) for (j = i + 1; j num; j+) if (sorti.st_mtime sortj.st_mtime) /按最后修改时间进行排序 tmps = sorti; sorti = s

16、ortj; sortj = tmps; /交换sorti与sortj /*交换snamei与snamej*/ strcpy(tmpn, snamei); strcpy(snamei, snamej); strcpy(snamej, tmpn); /*将排序后的文件信息输出*/ for (i = 0; i d_name0 = .) | (pd-d_name0 != .)/-a memset(fname, 0, 256); strcpy(fname, s); strcat(fname, /); strcat(fname, pd-d_name); lstat(fname, &statbuf); if

17、 (flag1) printf(%ldt, statbuf.st_ino);/-i if (flag0) lprint(fname);/-l printf(%s, pd-d_name); if (flag0) printf(n); else printf(t); printf(n); return 0; else if (flag1)printf(%ldt, buf.st_ino);/-i if (flag0) lprint(s);/-l printf(%s, s); if (flag0) printf(n); else printf(t); printf(n);/*lprint函数处理-l格

18、式输出*/void lprint(char* fname) struct stat buf; int n; char link256; struct passwd *pw; struct group *gr; struct tm *t; lstat(fname, &buf); switch (buf.st_mode & S_IFMT)/获取并转换后打印文件类型 case S_IFREG: printf(-); break; case S_IFDIR: printf(d); break; case S_IFCHR: printf(c); break; case S_IFBLK: printf(b

19、); break; case S_IFIFO: printf(p); break; case S_IFLNK: printf(l); break; case S_IFSOCK: printf(s); break; for (n = 8; n = 0; n-)/获取并转换后打印文件的读写属性 if (buf.st_mode&(1 pw_name); gr = getgrgid(buf.st_gid);/所属组名 printf( %s, gr-gr_name); printf( %ld, buf.st_size);/字节数 t = localtime(&buf.st_mtime);/最后修改时间

20、printf( %d-%d-%d %d:%d , t-tm_year + 1900 , t-tm_mon + 1 , t-tm_mday , t-tm_hour , t-tm_min); if (S_ISLNK(buf.st_mode)/判断是否为链接 printf( - ); readlink(fname, link, 100); printf(%s, link); printf(t);4、运行结果与分析1.当不输入命令时,即为空命令。运行结果如下:2.-l命令运行结果如下:3.-i命令运行结果如下:4.-t命令运行结果如下:5.-l -i组合命令运行结果如下:6.-l -t组合命令运行结果

21、如下:7.-l -i -t组合命令运行结果如下: 此次实验的运行结果不仅包含单个的-l、-i、-t命令,而且还有两两之间的组合,甚至可以是三者的结合-l -i和-t一起输出。五、设计体会 本次实验是实现Linux下的ls功能。在实验过程中,首先初步熟悉了Linux系统,掌握了它的一些编程方法。其次对Linux的一些系统函数以及结构体也有了一定的了解。另外,通过这次实验,不仅使我对ls命令有了更深一层的认识,还学会了系统提供的命令实现的途径和方法。从以前仅仅是单纯地使用系统命令到现在可以自己通过编程来实现一些命令,能够感觉到些许的成就感。但同时,也发现了使用系统提供的命令和调用自己编写的命令感觉

22、是相差很大的。在这编程和使用的过程中,尽管出现了很多困难,软件不熟悉,代码不断报错出现bug,甚至是开发环境不知道如何配置,但是通过同学的帮助都顺利解决了这些问题。所以这也表明了我们还需要不断的学习和进步,这样才能进一步完善我们的代码,努力做得更好。六、参考文献1W.RichardStevens.StephenA.Rago.UNIX环境高级编程(第二版)M.人民邮电出版社.2006.05.2 Michael Kerrisk. Linux/UNIX系统编程手册.人民邮电出版社. 2014.01.3刘忆智.Linux从入门到精通.清华大学出版社.2010.01.4NeilMatthew,RichardStones.Linux程序设计.人民邮电出版社.2010.06.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1