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

知识点总结

  • 输入/输出(I/0)是在驻主存和外部设备(磁盘驱动器、终端、网络)之间拷贝数据的过程。
  • 输入操作是从I/O设备拷贝数据到主存。
  • 输出操作是从主存拷贝数据到I/O设备。

10.1 Unix I/O

  • 一个UNIX文件就是一个m字节的序列。
  • 所有的I/O设备(网络、磁盘、终端)都被模型化为文件。而所有的输入和输出都被当成对应得文件的读和写来执行。
  • 所有的输入和输出有统一的执行方式:
    1.打开文件:描述符。每个进程开始时都有三个打开的文件:标准输入(0),标准输出(1),标准错误(2)。
    2.改变当前的文件位置:当前位置k,这个文件位置是从文件开头起始的字节偏移量。
    3.读写文件: 一个读操作就是从文件拷贝n>0,个字节到存储器,从当前文件位置K开始,然后将K增加到k+n。给定一个大小为m字节的文件,当K>=m时执行读操作会触发EOF。
    4.关闭文件:关闭所有文件,释放存储器资源。

10.2打开和关闭文件

Open函数:打开一个已经存在或者创建一个新文件。

  • 返回值:文件描述符。(当前没有打开的最小描述符)
  • Char *filename:将filename转换为一个文件描述符。
  • Int flags:指明进程打算如何访问这个文件。
  1. O_RDONLY:只读
  2. O_WRONLY:只写
  3. O_RDWR:可读可写
  4. O_CREAT:如果文件不存在,就创建一个他的截断的空文件
  5. O_TRUNC:如果文件已经存在,就截断它
  6. O_APPEND:在每次写操作前,设置文件位置到文件的结尾处
  • Mode_t mode:指定文件的访问权限。

Close函数:关闭一个打开的文件。

10.3读和写文件

信息安全系统设计基础第九周学习总结_第1张图片

  • Read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,返回值0表示EOF,否则,返回值表示的是实际传送的字节数量。
  • Write函数从存储器位置buf拷贝最多n个字节到描述符fd的当前文件位置。
  • 不足值:read和write传送的字节比应用程序要求的少。
  1. 读时遇到EOF
  2. 从终端读文本行:返回的不足值等于文本行的大小。
  3. 读和写网络套接字:内部缓冲约束和较长的网络延迟。

10.4用RIO包健壮地读写

RIO提供两类不同的函数:

无缓冲的输入输出函数:直接在存储器和文件之间传送数据,没有应用级缓冲。对二进制数据读写到网络和从网络读写二进制数据尤其有用。

  • Rio_readn函数从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。在遇到EOF时只能返回一个不足值。
  • Rio_writen函数从位置usrbuf位置传送n个字节到描述符fd。不会返回不足值。

带缓冲的输入函数:高效地从文件中读取文本行和二进制文件,这些文件的内容缓存在应用级缓冲区内。带缓冲的RIO输入函数是线程安全的,它在同一个描述符上可以被交错地调用。

举例说明:编写一个程序来计算文本文件中文本行的数量
  • 调用包装函数rio_readlined:从内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动调用read重新填满缓冲区。(对于既包含文本行也包含二进制数据的文件,使用rio_readnb)。
    信息安全系统设计基础第九周学习总结_第2张图片

  • 每打开一个描述符都会调用一次rio_readinitb函数:它将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。
    信息安全系统设计基础第九周学习总结_第3张图片

函数解释:
  • Rio_readinitb函数从文件rp读出一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并用空(零)字符来结束这个文本行。
  • Rio_readlineb函数最多读maxlen-1个字节,余下的一个字符留给结尾的空字符。超过maxlen-1字节的文本行被截断,并用一个空字符结束。
  • Rio_readnb函数从文件rp最多读n个字节到存储器位置usrbuf。

Rio读程序的核心:rio_read函数

  • 当调用rio_read要求读n个字节时,读缓冲区内有rp->rio_cnt个读字节。如果缓冲区为空,那么会通过调用read再填满它。
  • 收到一个不足值并不是错误,只不过读缓冲区是填充了一部分。
  • 一旦缓冲区非空,rio_read就从读缓冲区拷贝n和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝的字节数。

10.5读取文件元数据

信息安全系统设计基础第九周学习总结_第4张图片

  • 应用程序通过stat和fstat函数,检索到关于文件的信息(文件的元数据)。
  • Stat函数以一个文件名作为输入,并填写下图stat数据结构中的各个成员。Fstat以文件描述符作为输入。
    信息安全系统设计基础第九周学习总结_第5张图片

  • 两个比较重要的成员:
  1. St_mode:编码文件许可位和文件类型(普通文件(S_ISREG)、目录文件(S_ISDIR)、套接字文件(S_ISSOCK))
  2. St_size:文件的字节数大小

10.6共享文件

  • 内核用三个相关的数据结构来表示打开的文件:
  1. 描述符表:由进程打开的文件描述符来索引,每个打开的描述符表项指向文件表中的一个表项。
  2. 文件表:打开文件的集合。所有的进程共享这张表。每个文件表的表项组成包括有当前的文件位置、引用计数和一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项的引用计数。内核不会删除这个文件表表项,直到他的引用计数为0.
    +V-node表:所有进程共享。每个表包含stat结构的大多数信息。
  • 三种情景:
  1. 不同的描述符通过不同的打开文件表表项来引用两个不同的文件。典型情况,每个描述符对应一个不同文件。
  2. 多个描述符通过不同的文件表表项来引用同一个文件。关键思想是每个描述符都有他自己的文件位置,所以对不同的描述符的读操作可以从文件的不同位置获取数据。
  3. 子进程有一个父进程描述符表的副本。父子进程共享相同的打开文件表集合,因此共享相同的文件位置。

10.7 I/O重定向

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

    Dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述符表表项nesfd以前的内容。如果newfd已经打开了,dup2会在拷贝oldfd之前关闭newfd。

10.8 标准I/O

  • 标准I/O库将一个打开的文件模型化为一个流。
  • 一个流就是一个指向FILE类型的结构的指针。
  • 类型为FILE的流是对文件描述符和流缓冲区的抽象。

10.9 综合我该使用哪些I/O函数

  • UNIX对网络的抽象是一种称为套接字的文件类型。
  • 标准I/O流,从某种意义上而言是全双工的。
  • 建议:在网络套接字上不要使用标准I/O函数来进行输入和输出,而要使用健壮的RIO函数。

重点命令复习

  • Man –k key1 | grep key2 |grep2:根据关键字检索系统调用。
    信息安全系统设计基础第九周学习总结_第6张图片

  • Grep -nr XXX / usr/include:查找宏定义,类型定义
    信息安全系统设计基础第九周学习总结_第7张图片

遇到的问题

1.一开始只有csapp.o文件,在虚拟机中始终无法转化为可执行文件。
信息安全系统设计基础第九周学习总结_第8张图片

2.找到了csapp.h文件和csapp.c文件,但依然无法运行。
信息安全系统设计基础第九周学习总结_第9张图片

3.其他文件也无法运行
信息安全系统设计基础第九周学习总结_第10张图片
信息安全系统设计基础第九周学习总结_第11张图片
信息安全系统设计基础第九周学习总结_第12张图片

参考资料

《深入理解计算机系统》及其配套代码

你可能感兴趣的:(信息安全系统设计基础第九周学习总结)