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

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

10.6 共享文件

  1. 对于内核而言,文件文件和二进制文件毫无区别。

  2. 共享文件

内核用三种相关的数据结构来表示打开的文件。

1)描述符表:它的表项由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个选项。
2)文件表:打开文件的集合是一张文件表来表示的,所有的进程共享这张表。包括当前的文件位置、引用计数以及一个指向v-node表中对应表项的指针。
3)v-node表:同文件表一样,所有的进程共享这张v-node表。每个表项包含stat结构中的大部分信息,包括st_mode和st_size成员。

             

               

                  

10.7 I/O重定向

  1. I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来:

             unix > ls > foo.txt
    
  2. I/O重定向如何工作——使用dup2函数

     #include <unistd.h>
     int dup2(int oldfd, int newfd);
                       返回:若成功则为非负的描述符,若出错则为-1.
    

实际是dup2函数(one case)。dup2函数对文件描述符表项进行重定位。

10.8 标准I/O

  1. 标准I/O :ANSI C定义的一组高级输入输出函数。如fopen,fclose,fread,fwrite,fgets,fputs,scanf,printf。

  2. 标准IO库将一个打开的文件模型化为一个流,对于程序员来说,一个流就是一个指向类型为FILE结构的一个指针。每个ANSI C程序开始都有三个打开的流stdin,stdout,stderr,分别对应于标准输入、输出、错误:

    #include <stdio.h>
    extern  FILE  *stdin;
    extern  FILE  *stdout;
    extern  FILE  *sterr;
    

    !类型为FILE的流是对文件描述符和流缓冲区的抽象。

10.9 该使用哪些I/O函数

标准I/O流,从某种意义上而言是全双工的,因为程序能够在同一个流上执行输入和输出。但是有一些限定:

  1. 限制1: 跟在输出函数之后的输入函数。如果中间没有fflush,fseek,fsetpos或rewind的调用,一个输入函数不能跟随在一个输出函数之后。fflush清空与流相关的缓冲区,后三个函数使用unix I/O lseek函数来重置当前文件的位置。

  2. 限制2: 跟在输入函数之后的输出函数。情况类同上。 这些限定给网络应用带来一个问题:因为对套接字使用lseek是非法的。用Rio包可以解决这个问题。用sprintf把输出格式化一个字符串,通过riowriten输出,傅rioreadlineb来读一行,用scanf来从文本中提取不同的字段。

 

原文地址:https://www.cnblogs.com/5317p/p/6059341.html