2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客

课上myod练习

1 参考教材第十章内容

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

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

  2. 要分模块,不要把代码都写入一个.c中

5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

在第一次尝试在我上次编写myod的基础上,通过调用FILE*fp指针到函数

hexdacimal.c

output.c

ascii.c

中但是出现了段错误的提示后,上网搜索后,发现是野指针,就是段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。所以不采用用FILE*fp作为参数传参

后面又改为将number作为总数和将数组传递到函数中去实现,又出现了段错误的提示。

通过刚才给出的链接中,进行调试后,又将代码进行了改进后,运行结果如下:



无法打开文件,也就是文件打开失败,在读取时出现了问题,于是又做了进一步的改进:



终于运行成功。代码如下:



在命令行输入文件名,即可显示出文件的内容。

掌握两个重要命令:

man -k key1 | grep key2| grep 2

根据关键字检索系统调用

grep -nr XXX /usr/include

:查找宏定义,类型定义

man命令,

man3是查找函数

man2是查找系统调用

man1是查找命令。

在输入如下命令就是查找从文件读取的系统调用有哪些。

man -k read | grep 2  | grep file

然后再输入

man 2 read

命令就能查看read的帮助

grep -nr "struct utmp" /usr/include

查找struct utmp在哪个头文件中定义linux头文件都在此目录下)。

学习head,tail的使用

通过使用命令

man head

查看head的帮助文档。

  • head命令默认显示头部的前N行
  • -q 隐藏文件名
  • -v 显示文件名
  • -c<字节> 显示字节数
  • -n<行数> 显示的行数

通过命令

head -3 1234.txt

显示文件前三行:

通过命令

head -c 7 1234.txt

显示文件前n个字节

通过命令

head -c -4 1234.txt

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

通过命令

head -n -2 1234.txt

输出文件除了最后n行的全部内容:

  • 与head命令相反,tail命令是用来查看具体文件后面几行的内容
  • 查看tail命令的API

  • -f 循环读取
  • -q 不显示处理信息
  • -v 显示详细的处理信息
  • -c<数目> 显示的字节数
  • -n<行数> 显示行数
  • –pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
  • -q, –quiet, –silent 从不输出给出文件名的首部
  • -s, –sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

查看文件后面几行的内容:

通过命令

tail -f 1234.txt

循环查看文件内容,用Ctrl+c来终止。

通过命令

tail -n +2 1234.txt

从第2行开始显示文件:

  • 编写伪代码
  • head和tail命令+文件名 默认输出10行内容。
main函数中命令行传入参数命令
调用head函数
将数组data及数组长度传入head函数中
利用循环中嵌套if条件
for( ;小于总长且小于10行; )
if(判断是否读取到的为换行符)
{
若为换行符
行数++且打印换行符
若不是
则打印字符
}

运行结果:(显示前10行内容)

tail伪代码:

main函数中命令行传入参数命令
调用tail函数
将数组data及数组长度传入head函数中
利用循环中嵌套if条件
for{(从后开始;大于0且小于10行;循环变量递减 )
if(判断是否读取到的为换行符)
{
若为换行符
行数++}
} 若不是跳出循环
for(等于行数;小于等于len;循环变量增加)
打印字符
}

运行结果(显示后10行):

head和tail代码的码云链接

第四周教材学习内容总结

本周学习第十章和附录A:

  • Unix I/O(打开文件,改变当前的文件位置,读写文件,关闭文件)
  • RIO包读写

健壮的包,会自动为你处理之前所述的不足值。

1.无缓冲的输入输出函数(调用rio_readn和writen函数)

2.带缓冲的输入函数(调用一个包装函数rio_readlineb)

  • linux内核用三个相关的数据结构来表示打开的文件

    1.描述符表

    2.文件表

    3.v-node表

  • 每个进程有单独的描述符表,但所有进程共享同一打开文件表和v-node表

  • 标准I/O

附录A:

  • unix中错误处理

1.Unix风格

2.Posix风格

3.GAI风格

  • 错误处理包装函数

教材学习中的问题和解决过程

  • 问题1:系统i/o重定向如何具体实现?

  • 解决:

    在网上查阅资料时,看到相关资料非常的详细:

    I/O重定向的原理和实现

  • 问题2:课本练习题代码10.1中运行结果的值为什么是3?

  • 解决:

    因为生命周期开始时0、1、2被占用,所以以后从3开始,所以对open的返回描述符为3。

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

  • 问题1:在编写如下代码时,遇到了问题:



    提示出现没有那个文件或目录。

  • 问题1解决方案:

    在上网查询后,发现因为没有导入csapp.h和csapp.c这两个头文件的原因。结果如下:



    首先在网上输入下载头文件地址,找到两个头文件,并把内容分别复制下来。在当前目录下输入命令,

vi csapp.c
vi csapp.h

并把代码粘贴进去。

在用命令sudo进行移动的操作,移动到/usr/include中。

在将csapp.h中的内容做一部分修改增加代码,然后用命令

gcc ***.c -o **** -lpthread

进行编译,然后再运行,问题得以解决。

  • 问题2:在运行课本p633页代码时,出现错误:地址错误的问题

  • 问题2解决方案:

    在网上搜索后暂未解决。

代码托管

上周考试错题总结

结对及互评

点评模板:

暂无

本周结对学习情况

- [20155215](http://www.cnblogs.com/xuanyan/p/7673735.html)

- 结对学习内容
- 共同学习课本第十章和附录A内容
- 分析课本中代码遇到的问题

思考

这周的学习内容主要是对文件的处理操作。教材中有很多的代码,通过自己运行加深了理解。而且在遇到问题后能通过自己查询然后解决会记忆更加深刻,也对以后的学习奠定了基础。

  • 运行课本p636页课后习题:



    运行结果:

从而更加说明了通过对代码的编译运行对代码的理解又加深了印象,也能得到正确的答案。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第四周 12/12 1/1 20/20
第五周 271/283 1/2 15/15
第6周 276/283 2/3 18/18

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

  • 计划学习时间:12小时

  • 实际学习时间:18小时

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

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

参考资料

2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客的更多相关文章

  1. 20135328信息安全系统设计基础第一周学习总结(Linux应用)

    学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Linux中用户管理命令/ ...

  2. 20135328信息安全系统设计基础第二周学习总结(vim、gcc、gdb)

    第三周学习笔记 学习计时:共8小时 读书:1 代码:5 作业:1 博客:7 一.学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 ...

  3. 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现

    20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...

  4. LINUX信息安全系统设计基础第一周学习总结

     Linux系统简介 一.实验内容 了解 Linux 的历史,Linux 与 Windows 的区别等入门知识. 二.实验要求 阅读linux简介与历史 三.实验步骤 二.Linux 与 Window ...

  5. LINUX信息安全系统设计基础第二周学习总结

    1 Linux命令 2 man命令 1.Terminal(终端) Linux 系统还提供了一个叫做终端模拟器的程序(Terminal),下面几个比较常见的终端模拟器,例如 gnome-terminal ...

  6. 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析

    20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...

  7. 20155217 《信息安全系统设计基础》week16课堂测试

    20155217 <信息安全系统设计基础>week16课堂测试 在作业本上完成附图作业,要认真看题目要求并提交作业截图. 在set的过程中,我们需要将hour部分进行赋值,赋值我们采用&q ...

  8. 2017-2018-1 20155232 《信息安全系统设计基础》第十周课堂测试(ch06)补交

    # 2017-2018-1 20155232 <信息安全系统设计基础>第十周课堂测试(ch06)补交 上课时完成测试后在提交的时候,没有提交成功,进行补交. 1.下面代码中,对数组x填充后 ...

  9. 20145213《信息安全系统设计基础》实验一 Linux开发环境的配置

    北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号:20145213 20145222 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...

随机推荐

  1. July 30th 2017 Week 31st Sunday

    Eternity is not a distance, but a decision. 永恒不是一段距离,而是一种决定. What can be called as eternity? Wealth ...

  2. December 17th 2016 Week 51st Saturday

    Great minds have purpose, others only have wishes. 杰出的人有着目标,其他人只拥有愿望. Are you clear about the differ ...

  3. codeforces 407C Curious Array

    codeforces 407C Curious Array UPD: 我觉得这个做法比较好理解啊 参考题解:https://www.cnblogs.com/ChopsticksAN/p/4908377 ...

  4. SDN第一次作业——关于网络编程

    你会选择作网络编程方向的程序员吗?为什么? 我觉得我应该不会选择成为专门从事网络编程的程序员,因为我的从事计算机的理想一直是希望开发出自己的一款软件和游戏,所以应该是比较偏向软工方向的,也报了栋哥的软 ...

  5. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  6. Codeforces Round #441 (Div. 2)【A、B、C、D】

    Codeforces Round #441 (Div. 2) codeforces 876 A. Trip For Meal(水题) 题意:R.O.E三点互连,给出任意两点间距离,你在R点,每次只能去 ...

  7. python 爬虫部分解释

    example:self.file = www.baidu.com存有baidu站的index.html def parseAndGetLinks(self): # parse HTML, save ...

  8. 协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)

    网络层(network layer)是实现互联网的最重要的一层.正是在网络层面上,各个局域网根据IP协议相互连接,最终构成覆盖全球的Internet.更高层的协议,无论是TCP还是UDP,必须通过网络 ...

  9. 笔试面试之C++

    7 类B是类A的公有派生类, 类A和类B中都定义了虚函数func(), p 是一个指向类A对象的指针,则p->A::func()将() A 调用类A中的函数 B 调用类B中的函数 C 根据p所指 ...

  10. Vue实现购物小球抛物线

    .shop{ position: fixed; top: 300px; left: 40px; } .ball{ position: fixed; left: 32px; bottom: 22px; ...