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

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

项目一:课堂提交补充

1 参考教材第十章内容

2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名

3 不要把代码都写入main函数中

4 要分模块,不要把代码都写入一个.c中

运行截图:

标准IO改为系统调用关键的几个修改点老师上课的时候已经给出

1是将定义的*file改变成fd然后标准I/O函数里的fopen换成系统调用的open

2是将标准中的读取下一字符的fgets改变成系统调用的读取整个长度字符的read

3是将标准中的关闭文件的fclose改变成关闭文件描述符close

main函数:

include "head.h"

include <stdio.h>

include <stdlib.h>

include <sys/types.h>

include <sys/stat.h>

include <fcntl.h>

include <unistd.h>

define SIZE 100

int main(int argc,char *argv[]) {
int fd=open(argv[3],O_RDONLY,0);
char ch[SIZE];
int length = read(fd,&ch,SIZE);
close(fd);

ascii(ch,length);

return 0; }

ASCII函数:

include "head.h"

define SIZE 100

void ascii(char ch[], int length)
{

int a=0,b=0;

while(length/16!= (b-1))
{

b++;

for(a=16(b-1);a<16b;a++)
{
if(ch[a]=='\n')
{ a++;
putchar(' ');
printf("\n");

}
if(ch[a]=='\0')
break;
putchar(' ');
printf("%c", ch[a]);
putchar(' ');
}
printf("\n");

for(a=16(b-1);a<16b;a++)
{

if(ch[a]"\n")
{ a++;
printf("%02x ",'\n');
}
if(ch[a]
'\0')
break;
printf("%02x ",ch[a]);
}
printf("\n");
}

}

实验中遇到的问题及解决:

开始时我的代码运行没有格式化输出,最后一个\n对应的数值只有一个a,这与-od的输出方式是不符的,-od的显示是0a,于是我把最开始的printf("%3x")在前面添0改成了printf("%03x)于是变成了这副模样

,接着我改成了%02x又成了这个样子

,最后重新把前面的空格改正后才成功。

项目二 学习教材第十章内容

以读的方式打开一个已经存在的文件:fd=Open("foo.txt",O_RDONLY,0);

打开一个已存在文件,并在后面添加一些数据:fd=Open("foo.txt",O_WDONLY|O_APPEND,0);

O_RDONLY:只读

O_WRONLY:只写

O_RDWR:可读可写

st_size成员包含了文件的字节数大小。st_mode成员则编码了文件访问许可位和文件类型。

Unix I/O模型是在操作系统内核中实现的。应用程序可以通过诸如open、close、lseek、read、write和stat这样的函数来访问Unix I/O。较高级别的RIO和标准I/O函数都是基于Unix I/O来实现的。

项目三 掌握两个重要命令:

man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用

grep -nr XXX /usr/include :查找宏定义,类型定义

虚拟机中的运行截图:

项目四 完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写

head的使用是显示打开文件的前10行内容而tail的使用是显示打开文件的后10行内容

虚拟机中的测试:

伪代码:

主函数中命令行传入参数命令
将数组及数组长度传入子函数
利用循环遍历数组中的前(后)十行
不是换行符则打印字符

产品代码:
head.h:

ifndef HEAD_H

define HEAD_H

include <stdio.h>

include <stdlib.h>

include <string.h>

void HEAD(char text[], int length);
#endif

main.c:

include "head.h"

include <stdio.h>

include <stdlib.h>

include <sys/types.h>

include <sys/stat.h>

include <fcntl.h>

include <unistd.h>

define SIZE 100

int main(int argc,char *argv[])
{
int fd=open(argv[2],O_RDONLY,0);
char ch[SIZE];
int length;
length = read(fd,&ch,BUFFERSIZE);
HEAD(ch,length);
close(fd);
return 0;
}

HEAD.c

include "head.h"

void HEAD(char text[], int length)
{
int i,count=0;
for(i=0;i<length,count<10;i++)
{
if (text[i]!='\n') printf("%c",text[i]);
else
{
count++;
printf("\n");
}
}
}

TAIL.c

include "head.h"

void TAIL(char text[], int length)
{
int i , count = 0;
int m=0
for(i = length; i > 0, count < 10; i--)
{
if(text[i]=='\n'){
count++;
}
}
for(m = i-1; m <= length; m++)
{
printf("%c", text[m]);
}
}

posted @ 2017-10-15 18:46  乐舞歌不是可爱送  阅读(307)  评论(1)    收藏  举报
Live2D