第十章 系统级I/O

  10.1 Unix I/O

    一个Unix文就是一个m个字节的序列

    Unix:将设备映射为文件的方式,允许Unix内核引出一个简单低级的应用接口

    能够使得所有输入输出都能以一种统一且一致的方式来执行:

      (1)打开文件

          Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入,标准输出,标准错误

      (2)改变当前的文件位置

          对于每个进程开始的文件,内核保持着一个文件位置,初始值为0

      (3)读写文件

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

          写操作就是从存储器拷贝n>0个字节到一个文件,从当前文件位置k开始,然后更新k

      (4)关闭文件

          当应用完成了对文件的访问之后,他就通知内核关闭这个文件。

  10.2 打开和关闭文件

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

      例:int open(char *filename,int flags,mode_t mode)

      open函数将filename转换为一个文件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没有打开的最小描述符。flags参数指明了进程打算如何访问这个    文件:

      flags参数也可以是一个或更多位掩码的或,为写提供一些额外的指示:

      mode参数指定了性文件的访问权限位:

  10.3 读和写文件

    read和write传送的字节比应用程序要少。这些不足值不表示有错误,出现这种情况的原因:

      (1)读时遇到EOF

      (2)从终端读文本行

      (3)读和写网络套接字

  10.4 用RIO包健壮地读写

    RIO提供两种函数:

      (1)无缓冲的输入输出的函数

      (2)带缓冲的输入函数

  10.5 读取文件的数据

    应用程序通过调用stat和fstat函数,检索到关于文件的信息

    stat函数以文件名作为输入,按如下图的一个stat数据结构的各个组成员

    fstat函数类似,但是以文件描述而不是文件名作为输入,其中:

      (1)st_size成员包含了文件的字节数大小

      (2)st_mode成员则编码了文件访问许可位和文件类型。

    Unix识别大量不同的文件类型:

      (1)普通文件包括某种类型的二进制文件或文本数据,但二者无区别

      (2)目录文件包含关于其他文件的信息

      (3)套接字是一种用来通过网络与其他进程通信的文件

    Unix提供的宏指令根据st_mode成员来确定成员的类型,下图列出了宏的一个字节

  10.6 共享文件

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

      (1)描述符表

        每个进程都有他独立的描述符表,他的表项是由进程打开的文件描述符来索引的,每个打开的描述符表项指向文件表的一个表项

      (2)文件表

        打开文件的集合是由一张文件表来表示的,所有的进程共享这张表

        每个文件表的表项组成包括:文件位置,引用计数,一个指向v—node表中对应表项的指针

      (3)v-node表

        所有进程共享该表,每个表的表项包含stat结构中的大多数信息,包括st_mode和st_size成员

    重要思想:

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

      (2)在内核删除相应文件表表项之前,父子进程必须都关闭他们的描述符

  10.7 I/O重定向

    dup2函数拷贝描述符表项odfd到描述符表项newfd,覆盖描述符表项newfd以前的内容,若果newfd已经打开了,该函数就会拷贝oldfd之前关闭newfd

  总结:

    (1)Unix提供了少量的系统计函数,他们允许应用程序打开,关闭,读写文件,提取文件的元数据,以及执行I/O重定向。

    (2)Unix的读写操作会出现不足值,应用程序必须能正确地预计和处理这种情况。

    (3)应用程序不应该直接调用Unix I/O函数,而应该使用RIO包,RIO包通过反复执行读写操作,直接传送完所有的请求数据,自动处理不足值。

    (4)Unix内和使用三个相关的数据结构来表示打开的文件:描述符表,文件表,v—node表

    (5)标准I/O库是基于Unix I/O实现的,并提供了一组强大的I/O例程

    主要参考资料:《深入理解计算机系统》

    虽然这次课本的内容较少,但相关代码题目较难理解,如题目10.2和10.3,代码大体上相同,就要相互结合的理解才能够明白共享文件的几种特殊情况和重要结论,所以,要对代码有充分了解就要逐句理解,这样才能收获。

    

      

20135234mqy-——信息安全系统设计基础第九周学习总结的更多相关文章

  1. 20135328信息安全系统设计基础第一周学习总结(Linux应用)

    学习计时:共xxx小时 读书: 代码: 作业: 博客: 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Linux中用户管理命令/ ...

  2. 20135328信息安全系统设计基础第二周学习总结(vim、gcc、gdb)

    第三周学习笔记 学习计时:共8小时 读书:1 代码:5 作业:1 博客:7 一.学习目标 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 ...

  3. LINUX信息安全系统设计基础第一周学习总结

     Linux系统简介 一.实验内容 了解 Linux 的历史,Linux 与 Windows 的区别等入门知识. 二.实验要求 阅读linux简介与历史 三.实验步骤 二.Linux 与 Window ...

  4. LINUX信息安全系统设计基础第二周学习总结

    1 Linux命令 2 man命令 1.Terminal(终端) Linux 系统还提供了一个叫做终端模拟器的程序(Terminal),下面几个比较常见的终端模拟器,例如 gnome-terminal ...

  5. 20135234mqy-——信息安全系统设计基础第二周学习总结

    Linux基础 1.Linux命令 command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数 选项(options)或参数(argument ...

  6. 20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试

    目录 [第九周学习总结] 教材内容总结 [第八周课上测试] (一)求命令行传入整数参数的和 (二)练习Y86-64模拟器汇编 (三)基于socket实现daytime(13)服务器和客户端 参考资料 ...

  7. 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B

    20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...

  8. 2017-2018-1 20155228 《信息安全系统设计基础》第六周学习总结&课下作业

    20155228 2017-2018-1 <信息安全系统设计基础>第六周学习总结&课下作业 教材学习内容总结 异常及其种类 异常可以分为四类:中断(interrupt) ,陷阱(t ...

  9. 20155326 2017-2018-1 《信息安全系统设计基础》第2周学习及课堂总结myod

    20155326 2017-2018-1 <信息安全系统设计基础>第1次学习及课堂总结myod 虚拟机之前出了一些问题,然后我重新弄了一个新的虚拟机. 先在虚拟机里面安装了git. 安完以 ...

随机推荐

  1. Python 核实文件是否存在的函数

    经常会用到的文件读取,首先要检测文件的状态 # 核实文件是否存在 # Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. # format ...

  2. iOS钱包卡券开发(往钱包里面加自己的卡券)

    参考文章 https://blog.csdn.net/sz_vcp2007/article/details/60762349 https://blog.csdn.net/eqera/article/d ...

  3. 源码 ServerParameter

    总结 1. 服务器参数类型和设置时刻 https://github.com/mongodb/mongo/blob/master/src/mongo/db/server_parameters.h // ...

  4. pandas3

    转自:http://python.jobbole.com/81212/ 介绍 也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为 pivot_table. ...

  5. Silver Cow Party---poj3268(最短路,迪杰斯特拉)

    Silver Cow Party Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u De ...

  6. 【python-opencv】19-Canny边缘检测

    Canny 边缘提取的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近 ...

  7. javaScript高级教程(四) 复制对象

    //返回新对象,双方互不影响 function clone(obj){ //alert('clone'); if(typeof(obj) != 'object') return obj; if(obj ...

  8. WebDriver 常用操作

    1 浏览器操作 2 窗口和弹框操作 3 cookies 操作 4 简单对象的定位 5 页面元素操作 6 鼠标事件 7 键盘事件 1 浏览器操作 #属性: driver.current_url #用于获 ...

  9. Window版本 安装mysql

    #1.下载:MySQL Community Server 5.7.16 http://dev.mysql.com/downloads/mysql/ 下载下来解压到指定目录 就安装完成了 #2.解压 如 ...

  10. MySQL数据库参数

    数据库参数 MYSQL数据库的参数配置一般在my.ini配置文件中修改/添加(部分参数也可以用set global 参数名=值 做临时调整,重启后失效),配置完后需要重启数据库才生效. 参数1:inn ...