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

第十章 系统级I/O

10.1  UNIX  I/O

1:系统级I/O

     什么是UNIX I/O?

    所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,

    允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O。

2:输入输出I/O是在主存和外部设备(如磁盘,网络和终端)之间拷贝数据的过程。

 

     输入就是从I/O设备拷贝数据到主存,而输出就是从主存拷贝数据到I/O设备。

3:打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的

     所有操作中标识这个文件。内核记录有关这个打开文件的所有信息,头文件可用来代替显式的描述符。

     UNIX外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)。

4:改变当前的文件位置:对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。

     应用程序能够通过执行seek操作,显式地设置文件的当前位置为k。

 

3:读写文件:一个读操作就是从文件拷贝N个字节到存储器;给定一个大小为m字节的文件,当k大于等于m是会触发一个称为(EOF)的条件。

     写操作就是从存储器拷贝n个字节到一个文件。

4:关闭文件,内核释放文件打开是创建的数据结构,并恢复描述符到描述符池中。

10.2 打开和关闭文件 

进程是通过调用open函数来打开一个已存在的文件或者创建一个新文件。

2:flags参数表示进程打算如何访问这个文件,它的值包括:O_RDONLY、O_WRONLY 、O_RDWR。

3:flags参数也可以是一个或者更多位掩码的或,提供一些额外的指示:O_CREAT、O_TRUNC:如果文件已经存在,就截断它,O_APPEND

4:mode参数指定了新文件的访问权限位。当进程通过带某个mode参数的open函数调用来创建一个新文件时,文件的访问权限位被设置为mode&umask。

5:关闭文件,应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。

10.3 读和写文件 

应用程序是通过分别调用系统函数 read和write函数来执行输入和输出的。
返回值-1表示错误,0表示EOF;

在某些情况下,read和write传送的字节比应用程序要求的要少,称为:不足值。

出现这种情况的可能的原因有:如果打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会导致read和write返回不足值。

 

10.4 用rio包健壮地读写

RIO提供了两类不同的函数:无缓冲的输入输出函数和带缓冲的输入函数。

  • 无缓冲的输入输出函数:直接在存储器和文件之间传送数据,对二进制数据在网络上读写尤其有用:因为对同一个描述符,可以任意交错地调用rio_ readn和rio_ writen,rio_ writen绝不会返回不足值。
  • 带缓冲的输入函数:rio_ reanlineb从文件独处一个文本行,拷贝至存储器位置usrbuf,空字符以结束这个文本行(最多读取maxlen-1个字节);rio_ readnb从文件最多读n个字节到存储器位置usrbuf。
  • 注意:如果rio_readn和rio_writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动地重启read或write。
10.5 读取文件元数据 

1:文件的元数据:

     a.应用程序能够通过调用stat和fstat函数检索到关于文件的信息。

     b.stat以一个文件名为输入,并且填充buf结构体。

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

     c.fstat函数只不过是以文件描述符而不是文件名作为输入。

2:文件类型:普通文件,某种类型的二进制或文本数据; 

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

3:Unix提供的宏指令根据st_mode成员来确定文件的类型。

 

10.6 共享文件 

内核用三个相关数据结构来表示打开的文件:描述符表、文件表、v-node表。

描述符表: 每个进程都有其独立的描述符表,每个打开的该表表项指向文件表中的一个表项;

文件表:表示打开文件的集合,所有进程共享; 
v-node表:进程共享,包含stat结构大多数信息。

多个描述符可以通过不同的文件表表项来引用同一个文件。

内核删除相应文件表表项之前,父子进程必须都关闭了它们的描述符。

 

10.7 I/O重定向

1:Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。

2:I/O重定向的工作方式: 一种是使用dup2函数。
   dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项newfd以前的内容。

10.8 标准I/O

  1. ANSI C定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。这个库(libc)提供了打开和关闭文件的函数(fopen和fclose)、读和写字节的函数(fread和fwrite)、读和写字符串的函数(fgets和fputs)、以及复杂的格式化I/O函数(printf和scanf)。
  2. 标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。

posted @ 2015-11-08 16:20  偷影子的人  阅读(238)  评论(0编辑  收藏  举报