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

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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define N 100
#define M 17
int 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

运行结果

课后练习:head,tail的使用

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

  1. head

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

    主要功能:

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

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

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

  1. 伪代码
int main(int argc,char *argv[])
{
	命令行设置指定输出的前n行行数;
	while(!feof(fp))
	{
		if(i<n)
		{
			按行读取文件;
			输出;
			i++;
		}
		else break;
	}
}
  • 运行结果与head命令结果的比较

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

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

代码托管

上周考试错题总结

无。

结对及互评

本周结对学习情况

- [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