第十章 系统级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. HDFS架构详解-非官档

    Namenode 1.namenode是一个中心服务器,单一节点(简化系统的设计和实现),负责管理文件系统的命名空间(namespace)以及客户端对文件的访问. 2.文件操作:namenode负责对 ...

  2. Python:正则表达式概念

    #正则表达式内容非常多,网上的学习资源也是目不暇接,我从中筛选学习并且整理出以下 的学习笔记 一.正则表达式匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一 ...

  3. 在选定合适的执行引擎之后,通过敏感字段重写模块改写 SQL 查询,将其中的敏感字段根据隐藏策略(如只显示后四位)进行替换。而敏感字段的隐藏策略存储在 ranger 中,数据管理人员可以在权限管理服务页面设置各种字段的敏感等级,敏感等级会自动映射为 ranger 中的隐藏策略。

    https://mp.weixin.qq.com/s/4G_OvlD_5uYr0o2m-qPW-Q 有赞大数据平台安全建设实践 原创: 有赞技术 有赞coder 昨天

  4. 匿名内部类的参数引用只能是final,可能遇到的问题及其解决

    这个是我碰到比较多次的问题,一开始是不解,不过查了下大家都觉得没什么,而且只是加个final好像影响也不大,于是我就直接加个final了事,之后也不管了 直到昨天: 遇到了这个宿命般的问题 难道解决方 ...

  5. tomcatserver解析(五)-- Poller

    在前面的分析中介绍过,Acceptor的作用是控制与tomcat建立连接的数量,但Acceptor仅仅负责建立连接.socket内容的读写是通过Poller来实现的.   Poller使用java n ...

  6. [vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick

    思路: 1. 组件的好处,重用性 2. 组件对的slot用法 3. 子如何调用父的数据 4. 子如何触发父的方法执行 5. 父如何触发子的方法执行 6. 如何创建组件和销毁自建--如何缓存避免每次切换 ...

  7. [py][mx]django项目-让系统用自定义的users表认证

    项目开端 参考的是mxonline项目 先把这两项完成 1.app设计 2.app的models的设计 经过分析系统有四个模块 users - 用户管理 course - 课程管理 oranizati ...

  8. Linux文本编辑器快捷方式

  9. XenServer:使用XenCenter开设VPS(多图完整版)

    打铁要趁热,咱们接着来玩XenServer.昨天赵容用机房提供的KVM给服务器装了XenServer,今天我们来玩更有意思的:开小鸡.装好XenServer之后,访问我们的服务器IP,就可以看到Xen ...

  10. LeetCode--687. 最长同值路径

    题目描述:给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值.这条路径可以经过也可以不经过根节点.注意:两个节点之间的路径长度由它们之间的边数表示. 示例1:输入: 5 / \ 4 5 / ...