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行

产品代码:

posted @ 2017-10-15 23:17  刘威良  阅读(384)  评论(2编辑  收藏  举报