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

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

教材学习内容总结

第十章:
打开关闭文件:
#include<unistd.h>
              int  open(char *filename ,int flags , mode_t mode);
              int close(int fd);
  • open函数将filename转换成一个文件描述符 ,出错为-1.

读写文件:

#include<unistd.h>
       ssize_t read(int fd ,void *buf,size_t n);
       ssize_t write(int fd ,void *buf,size_t n);
  • fd为文件描述符,即open函数的返回值,每次读入n个字符,存入buf地址的空间中。

教材学习中的问题和解决过程

(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

  • 问题1:如何正确理解Linux中的文件描述符与打开文件之间的关系
  • 问题1解决方案:
    1. 博客参考链接:文件描述符
  • 2.每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。具体情况要具体分析,要理解具体其概况如何,需要查看由内核维护的3个数据结构。
    1. 进程级的文件描述符表
    2. 系统级的打开文件描述符表
    3. 文件系统的i-node表

课上内容: myod-系统调用版本

  • 要求:
参考教材第十章内容
用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
不要把代码都写入main函数中
要分模块,不要把代码都写入一个.c中
提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
课上上传代码到码云
  • 首先关于od -tx1 -tc 文件名 指令 就是将读入文件用16进ascll值输出,需要调用函数有读文件函数和打开关闭文件。
  • od命令中前面有7个数字是八进制数字,代表当前已有字符数,
  • 经过多次修改和卢子杰同学的指导修改后代吗如下:
  1. 头文件:整合了本程序要用到的头文件:
#ifndef HEAD_H
#define HEAD_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<ctype.h>
#endif

2.产品代码myod:

#include"tou.h"  

void main (int argc,char *argv[]) 
{ 
  char ch[16];
  int a,j,i,x=0;
  int in=open(argv[1],O_RDONLY,0);
  


printf("%07o",0);
     printf(" ");





   while((a=read(in,ch,16))!=0)
   {
     x++;
    
     for(i=0;i<a;i++)
     if(!iscntrl(ch[i]))
     printf("%4x",ch[i]);
     printf("\n");
printf("        ");
     
     for(j=0;j<a;j++)
     if(!iscntrl(ch[j]))
     printf("%4c",ch[j]);
     printf("\n");
     printf("%07o",16*(x-1)+a);
     printf(" ");
     
   }
  close(in);

}

运行结果截图:

代码调试中的问题和解决过程

  • 问题1:字符和其ASCLL码读写对不齐

  • 问题1解决方案:输出时候读入了换行符,用iscntrl函数进行控制,判断字符c是否为控制字符,如果是则返回非零值,加条件限定
if(!iscntrl(ch[j]))
     printf("%4c",ch[j]);

完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写(3分)

  • head命令就是对文件打印代码,默认是从头开始打印前10行 ,也可以自定义打印
head -n 文件名
  • tail命令就是对文件打印代码,默认是从头开始打印后10行 ,也可以自定义打印
tail -n 文件名
  • 表示打印这个文件n行

伪代码:

  • myhead:
myHead  要打开的文件 
      {
      读入字符
       if(不是换行符)
       输出字符;
       else
       行数加1;
       
       if(读入10行)
       跳出循环;关闭文件
       }
  • mytail
mytail  要打开的文件 
      {
      读入所有字符,行数
       if(不是换行符)
       从最后一行输出字符;
       else
       行数减11;
       
       if(读入10行)
       跳出循环;关闭文件
       }

产品代码:

  • myhead:
#include"tou.h"  

void main (int argc,char *argv[]) 
{ 
  char ch[4000];
  int a,j,i,x=0;
  int in=open(argv[1],O_RDONLY,0);
  
   while((a=read(in,ch,4000))!=0)
   {
    
     for(i=0;i<a;i++)
   {
     if(ch[i]!='\n')
     printf("%c",ch[i]);
      else
       { printf("\n");     x++;}
    if(x==11)
   break;
   }
  
   }

  close(in);

}
  • mytail:
#include"tou.h"  

void main (int argc,char *argv[]) 
{ 
  char ch[4000];
  int a,i,j=0,x=0,line=0;
  int in=open(argv[1],O_RDONLY,0);

 while((a=read(in,ch,4000))!=0)
{
  for(i=0;i<a;i++)
{
   if(ch[i]=='\n')
      line++;
   else(j++);
}
}
  
   while((a=read(in,ch,4000))!=0)
   {
    
     for(i=j;i>0,x<11;i--)
   {
     if(ch[i]!='\n')
     printf("%c",ch[i]);
      else
       { printf("\n");   x++ ;}
    if(x==11)
   break;
   }
  
   }

  close(in);

}


代码托管


(statistics.sh脚本的运行结果截图)

其他(感悟、思考等,可选)

世上无难事,只怕有心人,只要肯下功夫,所有东西都会明白的。这周东西是学会运用i/o接口去调用文件并输出文件,这周花了些功夫,感觉收获不错。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第四周 400/1300 5/9 20/90

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:10小时

  • 实际学习时间:20小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @ 2017-10-15 17:14  20155202张旭  阅读(240)  评论(4编辑  收藏  举报