20135219洪韶武——信息安全系统设计基础第九周学习总结

信息安全系统设计基础第九周学习总结

学习时间:7小时

学习内容:课本第十章

 


 

一、第十章知识点(1~6)

第一部分:文件的概念及相关操作

1.每个unix文件都是一个m字节的序列;所有I/O设备如网络、磁盘和终端都被模型化为文件,而输入和输出就是对这些文件的读写操作。

2.unix系统中输入输出的操作:

  (1)打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符。unix系统创建每个进程的时候都有三个打开的文件:标准输入;标准输出,标准错误。

  (2)改变当前的文件位置:对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量)。

  (3)读写文件:读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n。

  (4)关闭文件:应用通知内核关闭这个文件;作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池当中。

3.打开和关闭文件

   打开文件:fd = Open("文件名",flag位——表示访问方式及额外提示,mode参数);//出错的时候返回-1

   mode参数指定新文件的访问权限位。作为上下文的一部分,每个进程都有一个umask;当进程通过带某个带mode参数的open函数用来创建一个新文件的时候,文件的访问权限位被设置为mode & ~umask。

   fd是返回的文件描述符(数字),总是返回在进程中当前没有打开的最小描述符。

   flag参数可以是一位或者多位掩码的或,如:O_CREAT,表示如果文件不存在,就创建它的一个截断的文件。

   关闭文件:int close(int fd);//若成功则返回0,不成功则为-1

4.读写文件

 (1)读函数

    ssize_t read(int fd,void *buf,size_t n);//成功则返回n;EOF返回0;出错返回-1

         read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。

 (注意:EOF就是给定了m字节大小的文件;在从k字节位置开始读或者写的时候,发现k>=m)

    (2)写函数

     ssize_t write(int fd,const void *buf,size_t n);

 

第二部分:RIO包

1.无缓冲的输入输出函数:直接在存储器和文件之间传送数据。

     ssizet riowriten(int fd,const void *usrbuf,size_t n);

     ssizet riowriten(int fd,const void *usrbuf,size_t n);

     rio__writen函数遇到EOF的时候返回0;

     rio__readn遇到EOF的时候返回不足值。

2.带缓冲的输入函数:允许用户高效地从文件中读取文本行和二进制数据。

  原理:函数从内部缓冲区中拷贝一个文本行,当缓冲区变空的时候,会自动地调用read重新填满缓冲区。

3.带缓冲的输入函数详解

     rioreadinitb(riot *rp,int fd);

    //每打开一个描述符都会调用一次该函数,它将描述符fd和地址rp处的类型为rio_t的缓冲区联系起来。

    rioreadnb(riot *rp,void *usrbuf,size_t n) ;

    //从文件rp中最多读n个字节到存储器位置usrbuf。对同一描述符,rioreadnb和rioreadlineb的调用可以交叉进行。

    ssizet readlineb(riot *rp,void *usrbuf,size_t maxlen);

    //从文件rp中读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并用空字符来结束这个文本行。

4.RIO读程序核心:rio-read函数

 

(此处参考闫嘉歆博客:http://www.cnblogs.com/20135202yjx/p/4947272.html)

 

第三部分:读取文件元数据

 1.应用程序能够通过调用statfstat函数,检索到关于文件的信息,即元数据

    函数格式:

       #include <unistd.h>

    #include <sys/stat.h>

    int stat(cost char *filename,struc sta *buf);

    int fstat(int fd,struct stat *buf);

2.statfstat函数都需要填写stat结构体的各个成员。

    例如:stsize包含了文件的字节数大小;

       stmode编码了文件访问许可位和文件类型。

      (目录文件:包含关于其他文件的信息;套接字是一种用来通过网络与其他进程通信的文件)

 

第四部分:三个数据结构及文件共享方式

1.表示打开文件的三个数据结构

    描述符表:每个进程都有独立的描述符表;它的表项是由进程打开的文件描述符来索引的。

    v-node表:所有进程共享。每个表项包含stat结构中的大多数信息。

    文件表:表示打开文件的集合;所有的进程共享。表项有:文件位置、引用计数、指向v-node表中对应表项的指针。

2.文件共享方式

     (1)没有共享文件,每个描述符对应一个不同文件。

  (2)多个描述符也可以通过不同的文件表表项来引用同一个文件。(每个描述符都有自己的文件位置,所以对不同描述符的读操作可以从文件的不同位置获取数据)

  (3)父子进程可以共享文件。子进程会有一个父进程描述符表项的副本,父子进程打开相同的文件表集合,共享相同的文件位置。在内核删除相应的文件表表项之前,父子进程都必须关闭相应的描述符表项。

 


二、参考资料

1.《深入理解计算机系统》

2.闫嘉歆博客:http://www.cnblogs.com/20135202yjx/p/4947272.html

 

 


三、心得体会

  本周通过对第十章前六节的学习,对文件方面的知识有了了解,有些地方感觉不是很容易理解,需要再多实践运用来理解。

 

posted @ 2015-11-08 21:44  5219hsw  阅读(223)  评论(0编辑  收藏  举报