第十章 系统级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. CodeForces - 665D Simple Subset 想法题

    //题意:给你n个数(可能有重复),问你最多可以取出多少个数使得任意两个数之和为质数.//题解:以为是个C(2,n)复杂度,结果手摸几组,发现从奇偶性考虑,只有两种情况:有1,可以取出所有的1,并可以 ...

  2. 批量转换gbk编码的java代码为utf8

    #!/bin/bash echo $1 echo $# if [ ! $# -eq 1 ]; then     echo "usage:  ./gbk2utf8.sh src"   ...

  3. ArcGIS API for javascript开发笔记(二)——解决ArcGIS Service中的服务在内网环境下无法进行javascript预览问题

    感谢一路走来默默支持和陪伴的你~~~ ----------------------------拒绝转载-------------------------------- 1.问题说明 在使用ArcGIS ...

  4. CyanogenMod---android

    http://blog.csdn.net/sheldon4090/article/details/7736957--service. android进程间通信:使用AIDL http://blog.c ...

  5. 【make install】自定义安装目录,添加动态链接库 【--prefix】 【ldconfig】 【LD_LIBRARY_PATH】

    怎么卸载make install安装的软件? https://www.zhihu.com/question/20092756 怎么指定安装目录以及对应的添加动态库的方法 linux库在不指定安装路径时 ...

  6. 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__

    关于call与apply的理解容易让人凌乱,这里有个方法可供参考 tiger.call(fox,arg1,arg2...) tiger.apply(fox,[arg1,arg2...]) 理解为 fo ...

  7. qt——常用的布局方法

    布局相关对象及简介 窗体上的所有的控件必须有一个合适的尺寸和位置.Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLa ...

  8. PAT Sign In and Sign Out[非常简单]

    1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...

  9. cmd重启服务器,有时不想去机房,并且远程桌面连接登录不上了

    有时不想去机房,并且远程桌面连接登录不上了,需要远程重启服务器的,这时可以使用命令行方式远程重启.在cmd命令行状态下输入:shutdown -r -m \\192.168.1.10 -t 0 -f ...

  10. 【GISER && Painter】矢量切片(Vector tile)

    说明:本月的主要工作都是围绕制作矢量切片这一个核心问题进行的,所以2月的主题就以这个问题为主,目前分支出来的一些内容主要包括了TMS(Tile map service),OpenLayers3中的Pr ...