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

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

课上实践

1 参考教材第十章内容

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

  1. 不要把代码都写入main函数中

  2. 要分模块,不要把代码都写入一个.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行的控制不能通过返回的字节数控制。

  • 解决方案:在函数中加了一个根据\n来递减的值,循环条件包括该值不能为0,就解决了。

  • 问题三:执行后只出现一个head,其他都没了。如下图

  • 解决方案:查看代码想到是不是因为算去行数的原因,使得文件打开后再次使用出现了问题,添加了一个文件的关闭功能,再次尝试,则恢复正常。

代码托管

上周考试错题总结

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

还是需要加强能力,提高时间利用率。

  • 计划学习时间:10小时
  • 实际学习时间:17小时

参考资料

posted @ 2017-10-14 10:59  20155339平措卓玛  阅读(322)  评论(1编辑  收藏  举报