20145317《信息安全系统设计基础》第9周学习总结2
20145317《信息安全系统设计基础》第9周学习总结2
10.6 共享文件
-
对于内核而言,文件文件和二进制文件毫无区别。
-
共享文件
内核用三种相关的数据结构来表示打开的文件。
1)描述符表:它的表项由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个选项。
2)文件表:打开文件的集合是一张文件表来表示的,所有的进程共享这张表。包括当前的文件位置、引用计数以及一个指向v-node表中对应表项的指针。
3)v-node表:同文件表一样,所有的进程共享这张v-node表。每个表项包含stat结构中的大部分信息,包括st_mode和st_size成员。
10.7 I/O重定向
-
I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来:
unix > ls > foo.txt
-
I/O重定向如何工作——使用dup2函数
#include <unistd.h> int dup2(int oldfd, int newfd); 返回:若成功则为非负的描述符,若出错则为-1.
实际是dup2函数(one case)。dup2函数对文件描述符表项进行重定位。
10.8 标准I/O
-
标准I/O :ANSI C定义的一组高级输入输出函数。如fopen,fclose,fread,fwrite,fgets,fputs,scanf,printf。
-
标准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: 跟在输出函数之后的输入函数。如果中间没有fflush,fseek,fsetpos或rewind的调用,一个输入函数不能跟随在一个输出函数之后。fflush清空与流相关的缓冲区,后三个函数使用unix I/O lseek函数来重置当前文件的位置。
-
限制2: 跟在输入函数之后的输出函数。情况类同上。 这些限定给网络应用带来一个问题:因为对套接字使用lseek是非法的。用Rio包可以解决这个问题。用sprintf把输出格式化一个字符串,通过riowriten输出,傅rioreadlineb来读一行,用scanf来从文本中提取不同的字段。