- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE 13
实验报告
实验名: Unix编程第一次实验
课程名: Unix编程环境
姓名:
学号:
班级:
实验目的:
练习vi,使用UNIX的系统调用和库函数,体会UNIX文件通配符的处理方式以及命令对选项的处理方式。
实验要求:
编程实现程序list.c,列表普通磁盘文件(不考虑目录和设备文件等),列出文件名和文件大小。
与ls命令类似,命令行参数可以有0到多个
0个参数:列出当前目录下所有文件
参数为普通文件:列出文件
参数为目录:列出目录下所有文件
实现自定义选项r,a,l,h,m以及--
r 递归方式列出子目录
a 列出文件名第一个字符为圆点的普通文件(默认情况下不列出文件名首字符为圆点的文件)
l 后跟一整数,限定文件大小的最小值(字节)
h 后跟一整数,限定文件大小的最大值(字节)
m 后跟一整数n,限定文件的最近修改时间必须在n天内
显式地终止命令选项
程序说明:
命令选项的存储:
struct options
{
Int aFlag,
rFlag,lFlag,hFlag,mFlag;
long lPara,hPara;
int mPara;
};
采用 struct options结构存储命令的选项,flag代表有无此选项,例如aFlag为1就表示有“-a”选项,aFlag为0则表示没有“-a”选项。
lPara、hPara和mPara用来存储”-l”、”-h”、”-m”选项所带的参数。
命令的读取:
struct path
{
char* path;
struct path* next;
};
采用函数getCommend读取命令,声明一个opEnd变量用来指示选项的输入是否结束。opEnd初始为0,代表选项的输入没有结束,当遇到“--“之后,opEnd置为1,代表选项输入结束。在opEnd为0的时候,命令中以”-“开头的,都认为是一个选项,在opEnd为1的时候,命令中以”-“开头的则不作为选项而作为命令的参数。
在识别选项的同时,也要读入命令的参数,命令的参数也就是文件地址,存储在结构struct path所组成的链表当中。在读完命令之后,需要判断一下链表是否为空,如果链表是空的则代表命令中没有参数,这是需要程序自动得把当前目录即”./“加入链表当中。
选项的判断:
int judje(struct options option,struct stat info,char* fileName)
采用函数 judje函数判断一个文件是否满足选项的要求,如果满足要求返回1,否则返回0。
选项的参数的获取:
int getPara(char* option)
采用函数getPara获取选项所带的参数,如果参数合法则把参数转化为int并返回,如果参数不合法,比如参数中字母或符号等则返回-1;
打印:
void listFiles(char* path,struct options option)
采用函数listFiles打印文件,当需要递归时,把当前打印的目录和需要递归的文件目录合并在一起传入listFiles中,进行递归。
实验结果:
输入命令:./list 不加选项和参数
输入命令:./list –a 打印文件名”.”开头的文件名及大小
输入命令:./list –l 4000 输出大小在4000自己以上的文件名及大小
输入命令:./list –h 5000 输出大小在5000字节一下的文件名及大小
输入命令:./list –m 2 打印两天之内修改过的文件名及大小
输入命令:./list –r | more 循环打印文件名及大小
输入命令:./list –r -- -a 循环打印文件名是-a的文件夹
输入命令:./list test*(相当于./list test test2)
Test:
Test2:
输入命令:./list list.c 打印list.c 文件
输入命令:./list –l 3000 –h 5000 –r –a -- /home/andy | more(复杂命令)
实验总结:
在打印过程中需要考虑一下集中特殊情况:
命令中没有参数
输入的路径本身就是一个文件
目录中“.”文件和”..”文件的问题。
对于第一种情况:
假如没有考虑到这个情况会导致没有任何输出的问题,而这个情况下是应该打印当前目录的。在编程中可以判断一下命令是否带有参数,如果没有参数就把当前目录当作参数传给程序。
对于第二种情况:
假如不考虑这个问题,会导致直接显示无法打开文件的情况。编程中可以首先判断一下,输入的
文档评论(0)