20135201李辰希第九周实验报告

 

学习计时:共xxx小时

读书:

代码:

作业:

博客:

一、学习目标

1. 掌握系统编程和系统调用的概念
2. 掌握系统编程错误处理的方式
3. 掌握Unix/Linux系统级I/O:open close read write seek stat 
4. 掌握RIO
5. 掌握I/O重定向的方法

二、学习资源

1. 教材:附录A,第10章《系统级I/O》

2. 课程资料:https://www.shiyanlou.com/courses/413   实验11,课程邀请码:W7FQKW4Y

3. 教材中代码运行、思考一下,读代码的学习方法见这。

三、学习方法

1.  进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。

2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第九周学习总结”

 

四、学习任务

 

1. 阅读教材,注意每个系统调用的参数、返回值,会查帮助文档

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

2.重要命令:

    man -k key1 | grep key2| grep 2   : 根据关键字检索系统调用

    grep -nr XXX /usr/include  :查找宏定义,类型定义

3. 考核:教材内容,练习题把数据变换一下

4. 实验:需要动手的到实验楼中练习一下

 

、后续学习预告(可选):

教材第八章《异常控制流》

、学习过程

1.输入/输出(I/O)

  I/O是主存和外部设备(如磁盘驱动器、终端和网络)之间拷贝数据的过程。

  • 输入操作是从I/O设备拷贝数据到主存。
  • 输出操作是从主存拷贝到I/O设备。

2.Unix I/O

 在unix中所有的I/O设备都被模型化为文件,这使得所有的输入输出都能以一种统一的方式进行。

打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个I/O设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。

改变当前文件位置:对于每一个打开的文件,内核保持着一个文件位置k,初始时为0。这个文件位置是从文件开头起始的字节偏移量。应用程序能够通过执行seek操作,显示地显示当前文件位置。

读写文件:一个读操作就是从文件拷贝n>0个字节到存储器,从当前文件位置k开始,然后将增加到k+n。给定一个大小为m字节的文件,当k>=m时执行读操作会触发一个称为end-of-file(EOF)的·条件,应用程序会检测到这个符号。注:在文件结尾处并没有明确的"EOF符号"。

关闭文件:当应用完成对文件的访问后,它会通知内核关闭这个文件。内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池。无论一个进程因为何种原因终止时,内核都会关闭所有打开的文件并释放了它们的存储器资源。

 

3.打开和关闭文件

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

  filename为文件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没打开的最小描述符。

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

flags参数:

  • O_RDONLY:只读。
  • O_WRONLY:只写。
  • O_RDWR:可读可写。
  • O_CREAT:如果文件不存在,就创建它的一个截断的(空)文件。
  • O_TRUNC:如果文件存在就截断它。
  • O_APPEND:在每次写操作前,设置文件位置到文件结尾处。

 

  • mode参数指定了新文件的访问权限位。

 

4 用RIO包健壮地读写

RIO包的实质:I/O包 
RIO包提供的两种函数:
1.无缓冲的输入输出函数

2.带缓冲的输入函数(线程安全) 
应用程序通过调用rioreadn和riowritten函数可以在存储器和文件之间直接传送数据。

#include "csapp.h" ssize_t rio_readn(int fd,void *usrbuf,size_t n); ssize_t rio_writen(int fd,void *usrbuf,size_t n); 

rio_ readn函数在遇到EOF时,只能返回一个不足值; 
rio_ writen函数后局不会返回不足值。

 

5.共享文件

内核表示打开文件的数据结构

  • 描述符表:每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的。每个打开描述符表项指向文件表中的一个表象。
  • 文件表:打开文件的集合是由一个张文件表来表示的,所有进程都共享这张表。每个文件表的表项组成包括当前文件位置、引用计数(即当前指向该表的描述符项目数),以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的引用记数。内核不会删除这个文件表表项,直到他的引用计数为零。
  • v-node表:同文件表一样,所有的进程共享这张v-node表。每个表项都包含stat结构中的大多数信息包括st_mode和st_size成员。

6.I/O重定向

    Unix外壳提供I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。一般通过调用dup2函数实现I/O重定向。

 

7.标准I/O

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

#include <stdio.h> extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; 

类型为FILE的流是对文件描述符和流缓冲区的抽象。流缓冲区的目的和RIO读缓冲区的一样,就是开销较高的Unix I/O系统调用的数量尽量能的小。

 

 

 

七、遇到的问题及解决

这次很早就提交了,但周日晚上检查的时候发现随笔里啥也没有,所以只能先补一个简单版的,因为实验的截图都已经随手删了,所以没法体现实验的内容。

实验的时候被csapp.h卡住了,后来找同学解决了问题。

 

 

 

八、其他

这次的实验没有太大问题。但是代码之类的只能纯敲或者百度,对于代码的理解能力还是比较差。

你可能感兴趣的:(20135201李辰希第九周实验报告)