2017-2018-1 20155216 《信息安全系统设计基础》第四周学习总结
Myod系统版本调用:
1、参考教材第十章内容
2、用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
3、不要把代码都写入main函数中
3、要分模块,不要把代码都写入一个.c中
5、提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
实现截图:
核心代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
void main(int argc,char *argv[])
{
int m,n;
m=open(argv[1],O_RDONLY,0);
if(m==-1)
printf("not found");
zhuanhuan(m);
n=close(m);
if(n==-1)
printf("文件关闭失败");
void zhuanhuan(int m)
{
char temp;
while(read(m,&temp,1)!=0)
{
if(temp=='
')
printf("
");
else
{
printf("%x ",temp);
}
}
}
}
实现过程:
进程通过调用open函数来打开一个已存在的文件。
O_PDONLY只读,O_WRONLY只写,O_RDWR可读可写。
核心代码为fd=open("xxx.txt",O_RDONLY,0)
。
教材学习内容总结
一、Unix I/O
Linux提供少量基于Unix I/O模型系统级函数,它们允许应用程序打开、关闭、读和写文件,提取文件的元数据。
二、打开和关闭文件
进程通过调用open函数来打开一个已存在的文件。
函数头为:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
O_PDONLY只读,O_WRONLY只写,O_RDWR可读可写。
核心代码为fd=open("xxx.txt",O_RDONLY,0)
。
小结
1、Linux系统的读和写操作会出现不足值,应用程序必须能正确地预计和处理这种情况。应用程序不应直接调用Unix I/O函数,而应使用RIO包,RIO包通过反复执行读写操作,直到传送完所有的请求数据,自动处理不足值。
2、Linux内核使用三个相关的数据结构来表示打开的文件。
3、标准I/O库是基于Unix I/O实现的,并提供一组强大的高级I/O例程。对于大多数应用程序而言,标准I/O更简单,是优于Unix I/O的选择。
教材学习中的问题和解决过程
-
问题1:不明白元数据的定义。
-
问题1解决方案:
主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。 -
问题2:对于标准I/O理解不够透彻。
-
问题2解决方案:未解决,希望老师上课可以进行相应的讲解。
head tail的使用
head
API分析:head 数字 文件名
,查看文件前X行。
伪代码:
打开两个文件
读取输入的数字和文件
读取文件时,一旦字符为换行符,计数器+1
输出文件内容
当计数器的值等于读入的数字时,break退出循环
关闭文件
核心代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void main(int argc,char *argv[])
{
int count=0,m,n,x;
char temp;
x=atoi(argv[1]);//字符型转换整形,命令行读取
m=open(argv[2],O_RDONLY,0);
if(m==-1)
printf("not found");
while(read(m,&temp,1)!=0)
{
if(temp=='
')
{
count++;
if(count==x)
{
break;
}
else
printf("%c",temp);
}
else
printf("%c",temp);
}
printf("
");
n=close(m);
if(n==-1)
printf("文件关闭失败");
}
运行截图:
tail
伪代码:
打开两个文件
读取输入的数字和文件
读取文件时,一旦字符为换行符,计数器+1
关闭文件
x=计数器统计数,令计数器为0
打开文件
当计数器>=x时
输出文件内容
关闭文件
核心代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void main(int argc,char *argv[])
{
int count=0,m,n,x;
char temp;
x=atoi(argv[1]);//字符型转换整形,命令行读取
m=open(argv[2],O_RDONLY,0);
if(m==-1)
printf("not found");
while(read(m,&temp,1)!=0)
{
if(temp=='
')
{
count++;
}
}
x=count-x;
count=0;
n=close(m);
if(n==-1)
printf("文件关闭失败");
m=open(argv[2],O_RDONLY,0);
if(m==-1)
printf("not found");
while(read(m,&temp,1)!=0)
{
if(temp=='
')
{
count++;
}
if(count>=x)
{
printf("%c",temp);
}
}
printf("
");
n=close(m);
if(n==-1)
printf("文件关闭失败");
}
运行截图:
代码托管
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [结对同学学号1](博客链接)
- 结对照片
- 结对学习内容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可选)
1、Linux系统下的C源文件的处理方式比windows下的要更加丰富。
2、关于计算机语言中的各种运算仍需要加深理解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第三周 | 114/114 | 3/3 | 20/20 | |
第四周 | 136/250 | 2/5 | 18/38 | |
第五周 | 500/1000 | 3/7 | 22/60 | |
第六周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)