您的位置:首页 > 其它

2017-2018-1 20155321 《信息安全系统设计基础》第4周学习总结

2017-10-11 22:25 543 查看

2017-2018-1 20155321 《信息安全系统设计基础》第4周学习总结

任务一:课堂实践内容

题目要求:用Linux IO相关系统调用编写myod.c 用
myod XXX
实现Linux
下od -tx -tc XXX
的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名

我的思路

第一步,先要知道命令
od -tx -tc XXX
的实现效果,在虚拟机下输入命令,得到结果可得到结果,但由于觉得这样在视觉上的效果不佳,还是采用
od -tx1 -tc XXX
,如下图所示



由此可知,此命令的效果是把文本文件中的每一个字符的十六进制表达形式打印出来,因此,若要实现此功能,主要是将文本字符以十六进制的形式打印出来,又因题目要求需要进行系统调用,因此下一步首先需要做的是找到两个函数分别具有打开文本和将文本输出的功能。

第二步,有第一步的分析可知,目前是要找到内核提供的具有这两个功能的函数。为此,首先我要学会
man
命令的基本用法了解如何寻找一个我需要特定功能的内核提供的函数:输入命令
man -k system | grep call
来了解系统调用的相关信息,如下图所示



其中-k是帮助搜寻所指定的字串,即在man中查询使用命令
man -k keywords
,于是,在提示下输入
man 2 syscalls
查询帮助信息,其中2就是指定man手册的第二部分,此数字也可以省略,但系统调用和库函数同名的话,还是需要手动指定的。如下图所示



内核还是提供了不少函数的,但是相应的功能并不是很清楚地显示,为此,需要进一步搜索含有打开文本和文本输出功能的函数,类似地,输入命令
man -k read | grep file | grep 2
man -k open | grep file | grep 2
,通过提示找到内核函数
open()
read()
满足要求。

此步的参考资料

第三步,通过第二步找到了需要的内核函数,接着就需要知道如何使用这个函数,即这个函数的形参分别是什么,使用时需要注意哪些问题,输入命令
man 2 open
man 2 read
,如图所示





第四步,调用函数实现功能。首先,需要调用open函数打开文件,根据需求选择原型为
int open(const char *pathname,int flags);
即可,第一个参数的意思是路径,第二个参数的意思是以何种方式打开,根据要求选择
O_RDONLY
;read函数的原型采用
ssize_t read(int fd, void *buf, size_t count);
,因此代码如下



实践结果截图如下



实践过程中的问题和解决过程

问题1:在搜索内核函数的过程中。对于命令
man -k read | grep file | grep 2
man -k open | grep file | grep 2
grep file
grep 2
是表示什么意思,有什么作用?

问题1解决方案:grep是用于文本搜索(感觉有点像关键字检索),把匹配的项输出到屏幕上。

问题2:初次运行时结果有一些问题,最后两行字符不知道为什么出现了什么问题,如下图所示



问题2解决方案:刚开始并不知道为什么,猜测会不会由于最后一个字符是结束符或者换行符导致,于是特意在.txt文件的结尾处加了几个换行符,结果如下图所示



因此,可知道出现此情况的原因在于在最后一次显示的时候,应该是显示比read函数的返回值减1个值,因此应该将判断条件调整为



任务二:掌握两个重要命令

man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用

在实践编写myod的时候,已经使用并学会man的基本用法

grep -nr XXX /usr/include :查找宏定义,类型定义

用于阅读.h文件

任务三:完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写

head命令



通过man head了解head命令的主要功能,即输出文件开头的部分内容,所了解到的具体用途如下:

用途1:显示文件的前n行

用途2:显示文件的前n个字节

用途3:显示文件除了最后n个字节以外的内容

用途4:显示文件除了最后几行的全部内容

用途5:显示文件名



通过系统调用学习编写了head用途1的功能,结果如下



tail命令



通过man tail了解tail命令的主要功能,其实与head差不多,head处理文件开头部分,tail处理文件结束部分,所了解到的具体用途如下:

用途1:显示文件的最后n个字节,(加上+号的又有不同表现)

用途2:显示文件的后n行,(与用途1一样,加上+号有不同意义)

用途3:不显示/显示文件名

用途4:实时监控更新,若要设定一个间隔时间则使用-s参数



代码调试中的问题和解决过程

问题1:在利用系统调用来实现Head的第一个用途时,因为要输出前n行,而n是根据用户在命令行下输入的,但是命令行输入的数据属于字符串类型,不会因为用户输入一个数字就变成字符类型,刚开始编写时没有注意到这个地方

问题1解决方案:通过printf语句监控程序的输出,利用以前学的atoi函数将字符串类型转换为整型即可,具体代码如下:



代码托管



上周考试错题总结



其他(感悟、思考等,可选)

本周的课堂上主要复习并深入学习了之前学过的man命令,通过man命令去查找不了解的命令的功能,类似百度的功能,如果有良好的中文版翻译就更好了。另外,本周的编程着重于通过系统调用来完成Linux中某些命令的部分功能。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

计划学习时间:10小时

实际学习时间:12小时

改进情况:提高自己动手编程的效率

(有空多看看现代软件工程 课件

软件工程师能力自我评价表)

参考资料

《深入理解计算机系统V3》学习指导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐