20145235 《信息安全系统设计基础》第09周学习总结 _1
系统级I/O
- 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程。输入操作是(I/O)设备拷贝数据到主存,二输出操作是从主存拷贝数据到(I/O)设备。
- 在Unix系统中,是通过使用由内核提供的系统级Unix(I/O)函数来实现较高级别的(I/O)函数的。
10.1 Unix I/O
- 打开文件、改变当前文件位置、读写文件、关闭文件。
- 所有I/O设备,如网络、终端和磁盘,都被模型化为文件,二所有的输入和输出都被当做对相应文件的读和写来执行。
- 一个应用程序要求内核打开相应的文件,来宣告他要访问的I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续的所有操作中标识这个文件。内核记录有关这个打开文件的所有信息。应用程序只需记住这个描述符。
- 每个进程都由三个打开的文件:标准输入(0)、标准输出(1)、标准错误(2)。
- 应用程序可以通过seek操作,显示地设置文件的当前位置为k。
- 关闭文件:当应用程序完成对文件的访问之后,他会通知内核关闭这个文件。作为响应,内核释放文件打开时创建的数据结构,并将描述符恢复到可用的描述符池中。
10.2 打开和关闭文件
- open函数:
- flags参数指明了进程打算如何访问这个文件。也可以是一个或者更多位掩码的或,为写提供一些额外的指示。
- mode参数指定了新文件的访问权限位。
10.3 读和写文件
- read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示出错,而返回值0表示EOF。否则返回值表示的是实际传送的字节数量。
- write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。
- 读文件时会遇剩下未读的字节数少于一次所读的量是,会返回不足值,初次遇到返回值会返回小于定义的字节数,后续的read会返回0。
- 除了EOF,在读磁盘文件时,不会遇到不足值。
10.4 用RIO包健壮的读
- RIO包是一个I/O包,它会自动处理不足值,在容易出现不足值的应用中,RIO包提供了方便、健壮和高效的I/O。
- RIO提供了两类不同的函数:无缓冲的输入输出函数、带缓冲的输入函数。
10.4.1 RIO的无缓冲的输入输出函数
- rio_readn函数从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。
- rio_writen函数从位置usrbuf传送n个字节到描述符fd。
10.4.2 RIO的带缓冲的输入函数
- 一个文本行就是一个由换行符结尾的ASCII码字符序列。在UNIX系统中,换行符('\n')与ASCII码换行符(LF)相同,数字值为0x0a。
- rio_readlined函数从文件rp读出一个文本行,将他宝贝到存储器位置usrbuf,并且用空字符来结束这个文本行。函数最多读maxlen-1个字节,余下的一个字符留给结尾的空字符。超过maxlen-1的文本行被截断,并用一个空字符结束。
- rio_readnb函数从文件rp最多读n个字节到存储器位置usrbuf。最同一个描述符,rio_readnb和rio_readlined的调用可以任意交叉进行。但不能和无缓冲的rio_readn函数交叉使用。
- RIO读程序的核心是rio_read函数,该函数是Unix read函数的带缓冲的版本。当调用rio_read要求读n个字节时,读缓冲区内有rp→rio_cnt个未读的字节。如果缓冲区为空,那么会通过read再填满它。这个read调用收到一个不足值并不是错误,只不过是缓冲区填充了一部分。一旦缓冲区非空,rio_read就从读缓冲区拷贝n和rio→cnt中较小值个字节到用户缓冲区,并返回拷贝的字节数。
10.5 读取文件元数据
- 应用程序能够通过调用stat和fstat函数,所索引到关于文件的信息元数据。
- stat函数以一个文件名为输入
- fstat函数以文件描述符为输入
- 普通文件包括某种类型的二进制或文本数据
- 对于内核而言文本文件和二进制文件毫无差别
- 目录文件包含其他文件的信息
- 套接字是一种通过网络与其他进程通信的文件
问题与感想
这几天先把书看完,有一定的知识基础我再去敲代码,做实验楼。书看了三遍第一遍,问题很多;第二遍边看边百度,解决了大部分问题;第三遍通过写博客整理知识点,再看看书。只能给自己个及格,能理解书上所讲的大部分知识,因为还没有去敲代码、去实践所。明天开始敲代码,做实验楼。
第一个问题是关于“文件描述符”,第一遍看书的时候,书上就讲了一点点,根本看不懂,做练习题10.1连答案都看不懂。第二遍的时候百度了一下,上面讲的很详细,就一下子懂了。
第二个问题是“创建一个截断的文件”没有理解,也没有百度到。其实能想到大概是怎么回事,但不是很清晰,希望老师指点一下。
对于rio_readn函数,并没有看懂他是如何健壮地读,与read函数相比差不多啊,都是拷贝到存储器位置,书上也没有将它是如何实现健壮地读。
第一个问题是关于“描述符”的问题,书上讲的不是很清楚,百度了一下,就明白了。
通过看这一章,我对函数的调用有了更深的理解,较高一级的函数通过调用较低级的函数来实现较低级函数实现不了的功能,较高级的函数被更高级的函数所调用去实现更高级的功能。这不由使我开始脑洞。。。。。。。