博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017-2018-1 20155330 《信息安全系统设计基础》第4周学习总结
阅读量:5051 次
发布时间:2019-06-12

本文共 2669 字,大约阅读时间需要 8 分钟。

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

课堂实践

myod-系统调用版本

  1. 参考教材第十章内容
  2. 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
  3. 不要把代码都写入main函数中
  4. 要分模块,不要把代码都写入一个.c中
  5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

思路及修改过程

首先可以确定的是od函数无需修改,需要达成条件主要在主函数中。

由课本第十章知识可知,需要修改的有文件指针、打开/关闭文件以及读取文件的函数。

原主函数

int main()  {    FILE *fp;    char ch[N],name[N];    int i=0;    printf("Input file name:");    scanf("%s",name);    if((fp=fopen(name,"r"))==NULL)    {        printf("ERROR!");        exit(0);    }    while(fgets(ch,17,fp))    {        od(ch,i++);    }    fclose(fp);}

需修改的部分

  1. int main() 将主函数改为调用参数形式,即int main(int argc,char *argv[])
  2. FILE *fp 删除文件指针。
  3. 将提示输入文件名和获取文件名的代码删除。
  4. 根据课本知识,可建立一个整型变量用于取得文件打开后的返回值,即int fd。以只读方式打开已存在文件则有fd=open(argv[1],O_RDONLY),当open()返回值为-1时打开文件失败。
  5. 循环体条件由fgets(ch,17,fp)更改为read(fd,ch,16)==16即从描述符为fd的当前文件位置复制最多16个字节到内存位置ch中。
  6. 最后用close()函数关闭文件即可。
  7. 除此之外,还需要对头文件进行修改,即增加包含以上函数的相关头文件。

修改后的主函数

#include 
#include
#include
#include
#include
#include
#define N 100#define M 17int main(int argc, char *argv[]){ //FILE *fp; int fd,i=0; char ch[N],name[N],ch; fd=open(argv[1],O_RDONLY); if(fd==-1) { printf("ERROR!"); exit(0); } while(read(fd,ch,16)==16) { od(ch,i++); } close(fd);}

遇到的问题及解决过程

一开始循环体内条件为read(fd,ch,16)!=0,虽然在运行过程中没有出错,但在仔细阅读课本内容后发现,read函数的返回值存在三种情况:

  1. 返回值为-1 表示一个错误
  2. 返回值为0 表示EOF
  3. 返回值为一个数 表示实际传送的字节数量
    由于已知od -tc -tx1命令中一行只能输出16个字节的字符,则判断条件应控制为传送16个字节,所以最后将read(fd,ch,16)!=0修改为read(fd,ch,16)==16

运行结果

1071510-20171012095504184-1844504871.png

课后练习:head,tail的使用

首先我们需要知道head命令和tail分别是用来做什么的。

  1. head
    • 首先使用man -k head命令查看系统调用中的head
      1071510-20171015114505152-873275417.png
    • 利用man -k key1| grep key2| grep key3| ...缩小查找范围,这里使用的是man -k head | grep file
      1071510-20171015114635777-773012184.png
    • 可以发现head(1)是我们需要查看的内容
    • 最后利用man 1 head查看head的相关信息,可以知道head命令默认是查看文件的前10行:
      1071510-20171015113628387-1515007754.png

    主要功能:

    参数 功能
    -c 输出文件前num个字节
    -c -X 输出文件除最后几个字节外的所有内容
    -n 输出文件前n行内容
    -n -X 输出文件除最后几行外的所有内容
    -q 隐藏文件名
    -v 始终显示文件名
  2. tail

    查看tail命令的方式与head命令相同,以下是tail命令的主要功能。

    1071510-20171015124732184-379311608.png

    1071510-20171015125154309-732440887.png

用C语言实现head命令中-n的功能

  1. 伪代码
int main(int argc,char *argv[]){    命令行设置指定输出的前n行行数;    while(!feof(fp))    {        if(i
  • 运行结果与head命令结果的比较
    1071510-20171015112426980-1500020344.png

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

  • 问题1:在运行head命令相关文件后发现虽然按要求输出了指定行数的内容,但是程序并没有停止。
  • 问题1解决方案:通过if...else语句对程序的进程进行了控制,当达到循环条件时,语句跳转到else部分,else语句中添加break停止程序进程,跳出循环。

1071510-20171015161208043-708111814.png

上周考试错题总结

无。

结对及互评

本周结对学习情况

- [20155321](http://www.cnblogs.com/rafell/p/7653257.html)- 结对学习内容    - myod系统调用    - 第十章    - head、tail命令的使用

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 0/0 1/1 10/10
第二周 63/63 1/2 8/18
第三周 31/94 1/3 18/36
第四周 265/329 1/4 17/53

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

耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:,

  • 计划学习时间:10小时

  • 实际学习时间:17小时

(有空多看看)

参考资料

转载于:https://www.cnblogs.com/ashin-kl/p/7654711.html

你可能感兴趣的文章
虚拟机显卡分配过高的警告(Insufficient video RAM)
查看>>
JavaScript入门经典红皮书阅读笔记6.13(第二篇)
查看>>
file upload download
查看>>
mysql时间区间的查询
查看>>
游戏引擎剖析
查看>>
elasticsearch更改mapping(不停服务重建索引)
查看>>
作品第三课-----网页简易时钟
查看>>
Java复习:集合框架(一张图)
查看>>
online学习和offline学习
查看>>
win10安装多个mysql实例
查看>>
ASP.NET Core本身已经集成了一个轻量级的IOC容器
查看>>
JavaScript | 事件
查看>>
002 使用Appender扩展logger框架
查看>>
hdu4366 Successor (dfs序+zkw线段树)
查看>>
HDU 2674
查看>>
BUNOJ 4044
查看>>
JavaSctipt语句for循环的思考
查看>>
指令篇:ls、pwd、date、cal、bc、cd、mkdir、cp、mv、rm、basename、dirname
查看>>
框架代码 3
查看>>
CentOS7中编写java编译执行脚本
查看>>