2017-2018-1 20155323 《信息安全系统设计基础》第4周学习总结
2017-2018-1 20155323 《信息安全系统设计基础》第4周学习总结
课堂实践
- 1 参考教材第十章内容
- 2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
- 3 不要把代码都写入main函数中
- 4 要分模块,不要把代码都写入一个.c中
- 5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
首先是用man命令学习od
od命令 :用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。
命令中各选项的含义:
A 指定地址基数,包括:
d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值
t 指定数据的显示格式,主要的参数有:
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制(系统默认值为02)
u 无符号十进制数
x 十六进制数
除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数
head.h :
#ifndef HEAD_H
#define HEAD_H
void od(char a[],int);
#endif
od.c :
#include "head.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void od(char a[1000],int len)
{
int i,j=0,line=0;
printf("%06x",line);
printf("%4c",a[0]);
for(i=2;i<len+2;i++)
{
if(a[i-1]=='\n')
{
printf(" \\n");
continue;
}
printf("%4c",a[i-1]);
if((i%16==0)||(a[i-1]=='\0'))
{
printf("\n ");
for(j;j<=(i-1);j++)
printf(" %02x",a[j]);
line=line+32;
printf("\n%06x",line);
}
}
printf("\n");
}
MYod.c :
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "head.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char** argv)
{
char a[1000];
int fd,len;
fd=open(argv[1],O_RDONLY,0);//以只读模式打开文件
if(fd==-1)
{ printf("open file failed!!\n");
return 0;}
len=read(fd,a,sizeof(a)-1);
a[len]='\0';
close(fd);
od(a,len);
}
用gcc *.c命令将这三个代码一起编译,得到可执行文件a.out,然后用./a.out abc命令用来打开abc文件查看结果。
运行截图:
od命令对比:
代码托管
第十章 系统级I/O
Unix I/O
- 打开文件
- Linux shell创建的每一个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。
- 改变当前的文件位置
- 读写文件
- 关闭文件
文件类型
- 普通文件:包含任意数据,文本文件是只含有ASCII或Unicode字符的普通文件,二进制文件是所有其他的文件。
- 目录:包含一组链接的文件,其中每个链接都将一个文件名映射到一个文件,这个文件可能是另一个目录。
- 套接字:用来与另一个进程进行跨网络通信的文件。
- 目录层次结构中的位置有两种形式:绝对路径名和相对路径名。
打开和关闭文件
- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWR:可读可写
- O_CREAT:如果文件不存在,就创建它的一个截断的空文件。
- O_TRUNC:如果文件已存在,就截断它。
- O_APPEND:每次写操作前,设置文件位置到文件的结尾处。
共享文件
内核用三个相关的数据结构表示打开的文件
- 描述符表
- 文件表
- v-node表
教材学习中的问题和解决过程
问题1:ssize_t是什么类型的
解决:
在32位系统上 定义为 unsigned int 也就是说在32位系统上是32位无符号整形。在64位系统上定义为 unsigned long 也就是说在64位系统上是64位无符号整形。size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小。 它的意义大致是“适于计量内存中可容纳的数据项目个数的无符号整数类型”。所以,它在数组下标和内存管理函数之类的地方广泛使用。而ssize_t这个数据类型用来表示可以被执行读写操作的数据块的大小.它和size_t类似,但必需是signed.意即:它表示的是signed size_t类型的。
代码调试中的问题和解决过程
问题1:运行读取代码行数的脚本时权限不够
解决:
代码托管
结对及互评
本周结对学习情况
20155314刘子健
- 结对学习内容
第十章
感悟
学习好这章有利于写程序时熟练的进行文件运用。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 50/50 | 1/1 | 5/5 | |
第二周 | 100/100 | 1/2 | 5/10 | |
第三周 | 100/200 | 1/3 | 5/15 |
掌握两个重要命令
man -k key1 | grep key2| grep 2
根据关键字检索系统调用
grep -nr XXX /usr/include
查找宏定义,类型定义
完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写
文件:
用head.c输出前两行,用tail.c输出后三行
伪代码
将数组及数组长度传入子函数
利用循环遍历数组中的前(后)x行