2017-2018-1 20155330 《信息安全系统设计基础》第四周学习总结
课堂实践
myod-系统调用版本
- 参考教材第十章内容
- 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
- 不要把代码都写入main函数中
- 要分模块,不要把代码都写入一个.c中
- 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
思路及修改过程
首先可以确定的是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);
}
需修改的部分
int main()
将主函数改为调用参数形式,即int main(int argc,char *argv[])
。FILE *fp
删除文件指针。- 将提示输入文件名和获取文件名的代码删除。
- 根据课本知识,可建立一个整型变量用于取得文件打开后的返回值,即
int fd
。以只读方式打开已存在文件则有fd=open(argv[1],O_RDONLY)
,当open()返回值为-1时打开文件失败。 - 循环体条件由
fgets(ch,17,fp)
更改为read(fd,ch,16)==16
即从描述符为fd的当前文件位置复制最多16个字节到内存位置ch中。 - 最后用
close()
函数关闭文件即可。 - 除此之外,还需要对头文件进行修改,即增加包含以上函数的相关头文件。
修改后的主函数
#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 表示一个错误
- 返回值为0 表示EOF
- 返回值为一个数 表示实际传送的字节数量
由于已知od -tc -tx1
命令中一行只能输出16个字节的字符,则判断条件应控制为传送16个字节,所以最后将read(fd,ch,16)!=0
修改为read(fd,ch,16)==16
。
运行结果
课后练习:head,tail的使用
首先我们需要知道head
命令和tail
分别是用来做什么的。
-
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 始终显示文件名 - 首先使用
-
tail
查看
tail
命令的方式与head
命令相同,以下是tail
命令的主要功能。
用C语言实现head命令中-n的功能
- 伪代码
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小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)