博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20135337——信息安全设计基础第八周学习笔记
阅读量:6691 次
发布时间:2019-06-25

本文共 2049 字,大约阅读时间需要 6 分钟。

系统级I/O

知识点

一、Unix I/O

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

二、打开和关闭文件

1.打开文件

打开完成过以后会返回一个文件描述符,它在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。

  • 打开标志flags

基本标志:O_RDONLY、O_WRONLY、O_RDWR,也可以和其他三种(O_CREAT、O_TRUNC、O_APPEND)组合使用。
  • mode参数指定了新文件的访问权限位。

2.关闭文件

应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。

744834-20151108215727289-1817001624.png

三、读和写文件

1. read函数

从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量。

2.write函数

从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。返回值要么为-1要么为写入的字节数目。

3.lseek函数

显示的修改当前文件位置。

4.出现不足值的情况

a.读时遇到EOF。此时read返回0来发出EOF信号。b.从终端读文本行。如果打开文件是与终端相关联,那么每个read函数将以此传送一个文本行,返回的不足值等于文本行的大小。c.读和写网络套接字。可能会出现阻塞现象。

744834-20151108215813555-2012843997.png

四、用RIO包健壮地读写

提供了两类不同的函数:

无缓冲的输入输出函数 直接在存储器和文件之间传送数据。带缓冲的输入函数
  • rio_readn函数

1.从描述符fd的当前文件位置最多传送n个字节到存储器位置usrbuf。

2.遇到EOF只能返回一个不足值。

  • rio_writen函数

1.从位置usrbuf传送n个字节到描述符fd。

2.绝不会返回一个不足值。

  • 对同一个描述符,可以任意交错地调用rio_readn和rio_writen。

  • 编写计算文本文件中文本行的数量如何实现?

1.read函数,一次一个字节从文件传送到用户存储器,检查每个字节来查找换行符。(效率低)    2.rio_realineb包装函数,从一个内部读缓冲区拷贝一个文本行,当缓冲区变空时,会自动调用read重新填满缓冲区。
  • rio_realineb

1.从文件rp读出一个文本行,将它拷贝到存储器位置usrbuf,并用空字符结束这个文本行。

2.最多读maxlen-1个字节,余下的一个字符留给结尾的空字符串。

五、读取文件元数据

  • 文件的元数据

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

2.stat以一个文件名为输入,并且填充buf结构体。

3.fstat函数只不过是以文件描述符而不是文件名作为输入。

744834-20151108215842899-431912080.png

六、共享文件

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

a.描述符表。表项是由进程打开的文件描述符来索引的。每个打开的描述符表项指向文件表中的一个表项。b.文件表。每个文件表的表项组成包括由当前的文件位置、引用计数以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的应用计数。内核不会删除这个文件表表项,直到它的引用计数为零。c.v-node表。所有的进程共享这张v-node表,每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员。
  • 描述符1和4通过不同的打开文件表表项来引用两个不同的文件。

  • 多个描述符也可以通过不同的文件表表项来应用同一个文件。

  • 调用fork()之后

子进程有一个父进程描述符表的副本。父子进程共享相同的打开文件表集合,因此共享相同的文件位置。一个很重要的结果就是,在内核删除相应文件表表项之前,父子进程必须都关闭了他们的描述符。

744834-20151108220005789-995076948.png

六、i/o重定向

  • Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来。
     
    * I/O重定向的工作方式: 一种是使用dup2函数。

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

744834-20151108221400024-1584533054.png

744834-20151108221432367-995580148.png

遇到问题

1.练习题10.1没有出现应返回的值。

744834-20151108220226789-760947027.png

解决:缺少头文件。起初是把“csapp.h”换成open函数的头文件。

744834-20151108220632117-1393763246.png

744834-20151108220638180-1766479135.png

小组中同学详细的解答了这个问题,是缺少动态库。(ls视频中讲到了)

744834-20151108234215992-1526211584.png

时间

估计学习时间:5小时

实际学习时间:7小时

看书:2小时

代码:3.5小时
博客:1.5小时

参考资料

《深入理解计算机系统》

ls.tar视频

转载于:https://www.cnblogs.com/zzzz5/p/4936812.html

你可能感兴趣的文章
剑指offer-调整数组顺序使奇数位于偶数前面
查看>>
Flex布局新旧混合写法详解(兼容微信)
查看>>
2013 蓝桥杯 【初赛试题】 错误票据
查看>>
spring总结
查看>>
冒泡排序
查看>>
让SWF文件从原始保存位置拿出来到任意位置都可以播放的设置
查看>>
chm格式文档不能阅读问题
查看>>
FIS本地发布-其他同事通过IP访问
查看>>
圆的半径的算法
查看>>
centos安装python-opencv
查看>>
基于Google排名因素对Drupal进行SEO优化
查看>>
action中redirectAction到另一个命名空间中的action该如何配置
查看>>
label标签利用jquery获取值得方式为$("#message").html()
查看>>
javascript创建Ajax对象
查看>>
php文件缓存
查看>>
STS中logback.xml配置文件
查看>>
小菜鸟
查看>>
MFC Radio Button的基本应用
查看>>
sql union 列的字段不一样的时候
查看>>
思考方式--教会你如何去思考!
查看>>