第十章 系统级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. HDU_6033_Add More Zero

    Add More Zero Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. postgresql+postgis+pgrouting安装步骤图解

    1.在此(https://www.bigsql.org/postgresql/installers.jsp/)下载postgresql(开源数据库,gis行业推荐使用); 2.在此(http://wi ...

  3. pip freeze

    总结: 1.输出安装的包信息,并在另一个环境快速安装 Generate output suitable for a requirements file. $ pip freeze docutils== ...

  4. Kubernetes容器调度

    Kubernetes的调度器是Kubernetes众多组件的一部分,独立于API服务器之外.调度器本身是可插拔的,任何理解调度器和API服务器之间调用关系的工程师都可以编写定制的调度器.本文后面的介绍 ...

  5. fork 了别人的仓库后,如何将自己的代码和原仓库保持一致

    fork 了别人的仓库后,如何将自己的代码和原仓库保持一致 git remote add upstream http:// git fetch upstream  

  6. Python安装及运行中可能遇到的问题。

    1.报错找不到Selenium. 解决办法: (1)可以调整工具中的以下两项 Setting: (2)Setting中设置此目录为Python安装目录,选择设置中的第一项后配置以下Python3.5的 ...

  7. Unity注意事项

    1.尽量避免出现中文路径 2.做2D游戏时,图片最好要与背景图片保持一定距离 以免重叠

  8. Unity 脚本的执行顺序

    在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的. Awake ->OnEable-> Start -> FixedUpdate-> Update ...

  9. sap gui 使用方法, sap logon

    1:打断点:在程序保存并激活之后,可以打内部或外部断点. 如图示. 2:  display 展示程序,不能修改. 3: 查看创建的类的结构,使用more>display object list  ...

  10. 支持向量机:Numerical Optimization,SMO算法

    http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html 另外一篇:http://www.cnblogs.com/vivouni ...