第九周 第十章学习

学习任务

(一)第十章概念

1.输入\输出(I\O)是主存和外部设备之间拷贝数据的过程。(输入)I\O→主存(输出)主存→I\O。

2.了解Unix I/O将帮助你理解其他的系统概念;有时你除了使用Unix I/O外别无选择。

10.1

所有的I/O设备,如网络、磁盘和终端,都被模型化为文件,而所有的输入和输出都被当做对相应的文件的读和写来执行。这种将设备优雅地映射为文件的 方式,允许Unix内核引出一个简单、低级的的应用接口,称为Unix I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行:

  • 打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件 的所有操作中标识这个文件。内核记录有关这个打开文件的所有信息。应用程序只需记住这个描述符。Unⅸ外壳创建的每个进程开始时都有三个打开的文件:标准 输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)。头文件可用来代替显式的描述符值。
  • 改变当前的文件位置。对于每个打开的文件,内核保持着一个文件位置k,初始为0。这个文件位置是从文件开头起始的字节偏移量。应用程序能够通过执行seek操作,显式地设置文件的当前位置为k。
  • 读写文件。一个读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将k增加到k+n。给定一个大小为m字节的文件,当 k>=m时执行读操作会触发―个称为end-of-file(EOF)的条件,应用程序能检测到这个条件。在文件结尾处处并没有明确的“EOF”符 号。
  • 关闭文件。当应用完成了对文件的访问之后,它就通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放它们的存储器资源。

10.2

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

Int open(char *filename,int flags,mode_t mode);

Open函数将filename转换成为文件描述符并且返回描述数字。返回描述符总是在进程中当前没有打开的最小描述符。

l Flag参数指明了进程打算如何访问这个文件

  1. O_RDONLY: 只读。
  2. O_WRONLY: 只写。
  3. O_RDWR:可读可写。

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

1.O_CREAT:如果文件不存在就创建他的一个截断(空)文件。

2.O_TRUNC:如果文件已经存在,就截断它。

3.O_APPEND:在每次写操作前,设置文件位置到文件的结尾处。

l mode参数指定了新文件的访问权限位。符号名字如下图。作为上下文的一部分,每个进程都有一个umask它是通过调用umask函数来设置的。当进程通过带某个mode参数的open函数调用来创建一个新文件时,文件的访问权限位被设置为mode&umask。

10.3

应用程序是通过分别调用系统函数 read和write函数来执行输入和输出的。

read函数从描述符为fd的当前文件位置拷贝最多N个字符到存储位置buf。返回值-1表示错误一个,0表示EOF。

size_t是作为usigned int,而ssize_t是作为int。

在某些情况下,read和write传送的字节比应用程序要求的要少。出现这种情况的可能的原因有:

  • 读时遇到EOF。假设该文件从当前文件位置开始只含有20个字节,而应用程序要求我们以50个字节的片进行读取,这样一来,这个read的返回的值是20,在此之后的read则返回0。
    从终端读文本行。如果打开的文件是与终端相关联的,那么每个read函数将一次传送一个文本行,返回的不足值等于文本行的大小。
    读和写socket。如果打开的文件对应于网络套接字,那么内部缓冲约束和较长的网络延迟会导致read和write返回不足值。

10.4

1.RIO提供了两类不同的函数:

无缓冲的输入输出函数
带缓冲的输入函数

2.rio_readn函数从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。类似的rio_writen函数从位置usrbuf传送n 个字节到描述符fd。rio_readn函数在遇到EOF时只能返回一个不足值。rio_writen函数绝不会返回不足值。

注意:如果rio_readn和rio_writen函数被一个从应用信号处理程序的返回中断,那么每个函数都会手动地重启read或write。

3.一个文本行就是一个由 换行符 结尾的ASCII码字符序列。在Unix系统中,换行符是‘\n’,与ASCII码换行符LF相同,数值为0x0a。假设我们要编写一个程序来计算文本文件中文本行的数量应该如何来实现呢?

4.一种方法是用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。这种方法的问题就是效率不高,每次取文件中的一个字节都要求陷入内核。
一种更好的方法是调用一个包装函数(rio_readlineb),它从一个内部缓冲区拷贝一个文本行,当缓冲区变空时,会自动的调用read系统调用来重新填满缓冲区。

  • 在带缓冲区的版本中,每打开一个描述符都会调用一次rio_readinitb函数,它将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。
  • rio_readinitb函数从文件rp读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并且用空字符来结束这个文本行。
  • RIO读程序的核心是rio_read函数,rio_read函数可以看成是Unix read函数的带缓冲区的版本。当调用rio_read要求读取n个字节的时候,读缓冲区内有rp->rio_cnt个未读的字节。如果缓冲区为空 的时候,就会调用read系统函数去填满缓冲区。这个read调用收到一个不足值的话并不是一个错误,只不过读缓冲区的是填充了一部分。
  • 一旦缓冲区非空,rio_read就从读缓冲区拷贝n和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝字节的数目。
  • 对于应用程序来说,rio_read和系统调用read有着相同的语义。出错时返回-1;在EOF时,返回0;如果要求的字节超过了读缓冲区内未 读的字节的数目,它会返回一个不足值。rio_readlineb函数多次调用rio_read函数。每次调用都从读缓冲区返回一个字节,然后检查这个字 节是否是结尾的换行符。
  • rio_readlineb函数最多读取(maxlen-1)个字节,余下的一个字节留给结尾的空字符。超过maxlen-1字节的文本行被截断,并用一个空字符结束。

10.5

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

stat函数结构

st_size成员包含了文件的字节数大小。st_mode成员则编码了文件访问许可位和文件类型。Unix识别大量不同的文件类型。普通文件包括某种类型的二进制或文本数据。对于内核而言,文本文件和二进制文件毫无区别。

目录文件包含关于其他文件的信息。套接字是一种用来通过网络与其他进程通信的文件。Unix提供的宏指令根据st_mode成员来确定文件的类型。这些宏的一个子集如下:

10.6

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

描述符表
文件表
v-node表

10.7

Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。

I/O重定向的工作方式: 一种是使用dup2函数。

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

10.8

ANSI C定义了一组高级输入输出函数,成为标准I/O库,为程序员提供了Unix I/O的较高级别的替代。这个库(libc)提供了打开和关闭文件的函数(fopen和fclose)、读和写字节的函数(fread和fwrite)、 读和写字符串的函数(fgets和fputs)、以及复杂的格式化I/O函数(printf和scanf)。

标准I/O库将一个打开的文件模型化为一个流。对于程序员而言,一个流就是一个指向FILE类型的结构的指针。每个ANSI C程序开始时都有三个打开的流stdin、stdout和stderr,分别对应于标准输入、标准输出和标准错误:

10.9

各种I/O包

标准I/O流,从某种意义上来说是全双工的,因为程序能够在同一个流上执行输入和输出。

建议在网络套接字上不要使用标准I/O函数来进行输入和输出。而要使用健壮的RIO函数。

(二)练习题

1.完成课后练习(书中有参考答案)重点:10.1、10.2、10.3、10.4、10.5

10.1由于前面没学好,不知道下面这个是什么情况

后面也如此

10.4 重定向标准输入(描述符0)到描述符5,我们将调用dup2(5,0)或者等价的dup2(5,STDIN_FILENO).

2.重要命令:
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
grep -nr XXX /usr/include :查找宏定义,类型定义

时间: 2024-12-27 22:08:55

第九周 第十章学习的相关文章

2017-2018-2 20179205《网络攻防技术与实践》第九周作业

<网络攻防技术与实践>第九周作业 视频学习总结 一.KaliSecurity压力测试工具 ??压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能够提供的最大的服务级别的测试.通俗地讲,压力测试是为了测试应用程序的性能会变得不可接受. ??Kali下压力测试工具包含VoIP压力测试.Web压力测试.网络压力测试及无线压力测试. 1.Voip压力测试工具 包括iaxflood和inviteflood 2.web压力测试工具:THC-SSL-DOS ??借助THC-SSL-DOS攻击工

2017-2018-1 20179205《Linux内核原理与设计》第九周作业

<Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多时间等待I/O操作的完成:CPU-bound 是计算密集型,需要大量的CPU时间进行运算,使得其他交互式进程反应迟钝,因此需要不同的算法来使系统的运行更高效,以及CPU的资源最大限度的得到使用.第二种分类包括批处理进程(batch process):实时进程(real-time process)以及交互式进程

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

《网络攻防》第九周学习总结

Nmap使用实践 我们使用kali1.08攻击机对Linux靶机222.28.136.226进行nmap的相关实践,扫描其他靶机类似. 1.测试是否在线 2.查看靶机开放了哪些TCP和UDP端口及安装了什么网络服务: 3.查看靶机的操作系统版本 nmap使用方法总结: 通过主机探测,确定测试目标地址后,往往需要对主机信息做更完善的扫描.nmap可以完成以下任务:主机探测.端口扫描.版本检测.系统检测.支持探测脚本的编写.实际应用场合:通过对设备或者防火墙的探测来审计他的安全性:探测目标主机所开放

第九周学习总结

信息安全系统设计基础第九周学习总结 [学习时间:4小时] [学习内容:第十章——系统级I/O] 一.学习过程 1.所有的I/O设备都被模型化为文件,所有的输入输出都被当作对对应文件的读写来执行.unix内核引出一个简单的应用接口——unixI/O来统一地执行I/O操作. 2.unix系统中输入输出的操作: 打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符.unix系统创建每个进程的时候都有三个打开的文件:标准输入:标准输出,标

第九周java学习总结

20145306<java程序设计>第九周学习总结 教材学习内容总结 第十六章 一.JDBC入门 1.JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性,数据库本身是个独立运行的应用程序,你撰写的应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找.通常你的应用程序会利用一组专门与数据库进行通信协议的链接库,以简化与数据库沟通时的程序撰写.有时候,更换数据库的需求并不是没有,应用程

java第九周学习总结

学号20145336 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性. JDBC是Java联机数据库的标准规范.具体而言,它定义了一组标准类与接口,应用程序需要联机数据库时调用这组标准API,而标准API中的接口由数据库厂商操作,通常称为JDBC驱动程序. JDBC(Java DataBase Connectivity)是Java联机数据库

20135219洪韶武-信息安全系统设计基础第九周学习总结

第九周学习总结 一.课本内容 1.每个unix文件都是一个m字节的序列:所有I/O设备如网络.磁盘和终端都被模型化为文件,而输入和输出就是对这些文件的读写操作. 2.unix系统中输入输出的操作: 打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备,内核返回一个小的非负整数,叫做描述符.unix系统创建每个进程的时候都有三个打开的文件:标准输入:标准输出,标准错误. 改变当前的文件位置.对于每个打开的文件,内核保持着一个文件位置k(从文件开头起始的字节偏移量). 读

20155335 俞昆 2016-2017-2 《Java程序设计》第九周学习总结

学号 2016-2017-2 <Java程序设计>第九周学习总结 ##JDBC入门 在正式介绍JDBC前,已知JDBC是用来执行SQL的解决方案,开发人员使用JDBC的标准接口,开发人员不需接触底层数据库驱动程序的差异性. 本章,我们需要了解JDBC与API使用和概念,我们先要认识应用程序如何与数据库进行沟通,数据库本身是一种独立运行的应用程旭,程序员撰写的应用程序是利用通信协议对数据库进行指令交换,以进行数据的增加删除以及查找. 通常应用程序会利用一组专门与数据库进行通信协议的链接库,以简化