2017-2018-1 20155215 《信息安全系统设计基础》 第4周课上实践

课上实践

  1. 参考教材第十章内容

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

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

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

  5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

  6. 课上上传代码到码云

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);
}

学习参考:

posted @ 2017-10-15 19:14  xuanyan  阅读(254)  评论(7编辑  收藏  举报