2017-2018-1 20155215 《信息安全系统设计基础》 第4周课上实践
课上实践
-
参考教材第十章内容
-
用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
-
不要把代码都写入main函数中
-
要分模块,不要把代码都写入一个.c中
-
提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
-
课上上传代码到码云
od命令:
od命令
用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。
语法:od [选项] 文件…
命令中各选项的含义:
- A 指定地址基数,包括:
d 十进制
o 八进制(系统默认值)
x 十六进制
n 不打印位移值- t 指定数据的显示格式,主要的参数有:
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制(系统默认值为02)
u 无符号十进制数
x 十六进制数
除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数
课堂上没完成的原因:
我们已经完成了一个关于Myod的课后实践。这次又要用Linux IO相关系统调用来编写。但是我在课堂上的时候觉得还是不太理解系统调用的内容,就一直在学第十章,所以没有做出来。那张图是不小心交上去的。。。并不是那个的截图。
课下我又认真学习了系统调用的知识,然后对之前那个myod进行了修改。
遇到的问题:
然后我重新调整了我的编译,直接写成了
gcc *.c
进行编译,结果就成功了。
myod.txt
运行结果如下:
学习内容:
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
man
有一个
-k
选项,这个选项让你学习命令,编程时有了一个搜索引擎,可以举一反三。
比如我需要一个排序功能的函数,我就可以输入
man -k sort
来查找。而
man -k key1 | grep key2| grep 2
就是多关键字查找的意思,用|分隔符分开,输入多个关键字达到更好的查找我想要的函数的目的。
grep -nr XXX /usr/include :查找宏定义,类型定义
grep 命令可以对文件全文检索,比如你接手一个C语言项目,里面有上百个C源文件,想找找main函数在那个文件中,你可以通过
grep -n main *.c
,快速找到main在哪个C文件中并指出在第几行。
而且grep支持正则表达式,正则表达式也是一个重要的元知识。
我们可以通过
cheat grep
来学习grep命令。
而
grep -nr XXX /usr/include
则是可以帮助我们查找XXX在哪个头文件中定义。
完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写
-
head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
-
命令参数有:
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数
tail
-
用于显示指定文件末尾内容至标准输出,默认tail命令打印其相应文件的末尾10行
-
命令参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
相关API的分析,伪代码,产品代码,测试代码的编写
伪代码(Pseudocode)是一种算法描述语言。使用伪码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。以编程语言的书写形式指明算法职能。
-
head
-
产品代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main( )
{
int fd,c=0;
char ch;
fd=open(argv[1],O_RDONLY,0);
if(fd==-1)
{
printf("出现错误!");
exit(1);
}
while(fd,&ch,1)
{
printf("%c",ch);
}
close(fd);
exit(0);
}
-
tail
-
产品代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int fd1,fd2,c=0,n=0;
char ch;
fd1=open(argv[1],O_RDONLY,0);
if(fd1==-1)
{
printf("出现错误!");
exit(1);
}
while(read(fd1,&ch,1)!=0)
{
if(ch=='\n') c++;
}
close(fd1);
fd2=open(argv[1],O_RDONLY,0);
while(fd2,&ch,1)
{
if(ch=='\n') n++;
if(n>=c-10)printf("%c",ch);
}
close(fd2);
exit(0);
}