第十章 系统级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. Oracle安装部署之linux(redhat/centos)快速安装oracle 11g rac

    安装oracle 11gR2 RAC 一.网络规划及安装虚拟主机 主机名 主机版本 Ip rac1.localdomain Redhat 6.5 RAC节点1 192.168.100.11 rac2. ...

  2. PHP漏洞-Session劫持

    http://os.51cto.com/art/201204/328888.htm

  3. Master Boot Record

    https://en.wikipedia.org/wiki/Master_boot_record https://zh.wikipedia.org/wiki/主引导记录 A master boot r ...

  4. flask数据库操作

    Python 数据库框架 大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包.Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL.Postgres ...

  5. Linux 程序后台运行

    例子: shadowsocks 程序后台运行: sslocal -c /etc/shadowsocks-libev/config.json > /dev/>& & 参考: ...

  6. 2018/04/02 每日一个Linux命令 之 新建/修改/删除群组

    -- 新建群组 groupadd [群组名] -- 修改群组名称 groupmod [群组名] [新群组名] -n 修改组名 -g 修改组识别码 -- 删除群组 groupdel [删除的组名] --

  7. mysql获取下一篇和上一篇文章的ID

    mysql获取上一篇和下一篇文章的ID只要在当前页面读取上一个和下一个的ID就可以了.假设当前ID为10:搜索上一个的ID:select  id  from table where id<10 ...

  8. SpringMVC 问题 org.springframework.beans.factory.BeanDefinitionStoreException

    HTTP Status 500 – Internal Server Error Type Exception Report Message Servlet.init() for servlet [sp ...

  9. html 1:1比例显示

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale= ...

  10. .NET数据挖掘与机器学习开源框架

    1.    数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经 ...