2017-2018-1 20155339 《信息安全系统设计基础》第四周学习总结
课上实践
1 参考教材第十章内容
2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
-
不要把代码都写入main函数中
-
要分模块,不要把代码都写入一个.c中
分析并设计
1.要求是实现myod.c用myod XXX实现Linux下od -tx -tc,大致思想和模块可以使用上周的代码。
2.系统调用,学习了老师课上讲的内容,包括笔记,教材以及通过man xxx
的方法。在这里学会了使用man
来解决一些问题,首先你可以man
+ 要搜索的关键字,例如man perror
可以找到要搜索的关键字的帮助文档,其次可以通过条件进行搜索,例如,此处我要搜索打开一个文件的函数,那么就可以这样进行搜索man -k open | grep file | grep 2
,其中对-k
我的理解就是告诉他我需要条件搜索了,然后后面的|
就是挑拣间的一个分隔符,grep
后面加上条件,2表示系统调用。再通过man -k read | grep file | grep 2
命令找到读函数。
3.命令行传入:int main(int argc,char *argv[])
,argc代表命令行出入参数的个数,argv[]储存命令行传入的参数。
4.学习几个内核函数,可以通过man 2 read
来学习read()
函数,得到下图所示,那么就可以知道调用该函数的头文件以及参数类型,返回值等如下图,在此处,该函数的头文件是#include <unistd.h>
函数的各个参数为:ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。
5.修改主函数,实现功能,主函数修改如下:
运行结果如下:
遇到的困难和问题
-
问题一:命令行参数输入的文件名赋给一个字符类型的name时编译失败,那应该怎么使用?
-
解决方法:首先复习了命令行参数的使用,学习链接在下面给出,argv[0]指向该程序的名称,argv[1]开始才是用户键入的参数。那么可以直接使用argv[1],这就是我在上面贴出的主函数,那么为什么命令行参数输入的文件名赋给一个字符类型的name时会编译失败呢,多方查询,才发现,犯了个很傻的错误,name是个字符串,argv也是,我竟然用
=
赋值,课上正是因为这个问题没能继续后面的步骤,所以应该使用strcpy()进行复制,修改代码终于成功了,如下:
-
问题二:出现如下图提示
-
解决方法:一、使用
gcc *.c -lm
命令来链接库,后面两个提示没有了,第一个依旧在。二、查找PERROR的帮助文档,加入头文件也没用帮助。三、一一对照,最终发现是大小写错误,应该改成小perror
,编译,终于通过。 -
问题三:通过
read()
函数采用读取的16个字符来使用,会出现最后一行没有16个字符,但想前继续读取,凑成16个字符,如下图
-
解决方案:学习
read()
函数,由于帮助文档的英文不怎么看得懂,搜了一篇教程,链接附在下面,该函数返回值类型是ssize_t,即是有符号的,并且返回值是成功读取的字节数,那么就可以将返回值保存起来,传给自定义函数,并且控制输出的个数,得到解决。
head和tail的使用
head的分析并使用
-
是一个可执行程序或 shell命令,用于将每个文件的前10行打印到标准输出。使用多个文件,在每个文件之前,使用一个头文件来提供文件名字,如下图
-
功能一-c, --bytes=[-]NUM, 显示每个文件的前NUM个 字节个内容;如果附加了
-xx
参数,则表示除了该文件的最后xx个字符以为全部显示。如下图
-
-n, --lines=[-]NUM 显示每个文件的前NUM行内容; 如果附加了
-xx
参数,则显示除了每个文件的最后xx 行外的全部内容。如下图
-
-q, --quiet, --silent 不显示包含给定文件名的文件头,可以用于有多个文件同时使用时,如下图:
-
-v, --verbose 总是显示包含给定文件名的文件头,如下图
-
-z, --zero-terminated,行分隔符是空,不是换行符
--help,显示此帮助信息并退出
--version,显示版本信息并退出
tail的分析及使用
- 是一个可执行程序或 shell命令,用于将每个文件的最后10行打印到标准输出。使用多个文件,在每个文件之前都有一个提供文件名的头文件。
- -c、-n、-q、-v的情况下与head相似,只是从文件最后往前打印,有
+xx
参数的,是一直打印到文件头第xx个字节或者行。如下图
- -f实时监控,以Ctrl-c结束实时监控。
代码的编写
伪代码:
命令行接收用户命令;
if判断命令种类以及功能;
判断有无参数,并储存参数;
按参数或默认值输出;
产品代码码云链接
此处着重实现了-n
的部分,其他部分类似,tail与head也是换汤不换药。
- 运行结果
编写过程中遇到的问题
-
问题一:读取行数一直不出来。
-
解决方案:单步调试,发现函数根本进不去,换了一种读取文件的方法,使整个代码读取文件的方式统一之后就可以了。
-
对于默认情况下读取10行的控制不能通过返回的字节数控制。
-
解决方案:在函数中加了一个根据 来递减的值,循环条件包括该值不能为0,就解决了。
-
问题三:执行后只出现一个head,其他都没了。如下图
-
解决方案:查看代码想到是不是因为算去行数的原因,使得文件打开后再次使用出现了问题,添加了一个文件的关闭功能,再次尝试,则恢复正常。
代码托管
上周考试错题总结
无
其他(感悟、思考等,可选)
还是需要加强能力,提高时间利用率。
- 计划学习时间:10小时
- 实际学习时间:17小时