博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
信息安全系统设计基础第八周学习总结
阅读量:6973 次
发布时间:2019-06-27

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

第十章系统级I/O

 

10.1 Unix I/O

l  所有I/O设备都被模型化为文件,所有输入输出都被当作对相应文件的读和写。这使得所有的输入和输出都能以一种统一且一致的方式来执行。

n  打开文件:应用程序需要打开文件时,内核返回一个小的非负整数(描述符),每个进程开始时都有三个打开的文件,标准输入(描述符0)、标准输出(描述符1)、标准错误(描述符2)

n  改变当前的文件位置

n  读写文件:end-of-file(EOF)

n  关闭文件

 

10.2打开和关闭文件

l  int open(char *filename, int flags, mode_t mode)

  • open函数将filename转换为一个文件描述符。Flags参数指明了进程打算如何访问文件。O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(可读可写)、O_CREAT、O_TRUNC、O_APPEND。mode参数指定了新文件的访问权限位。

 

10.3读和写文件

l  read函数:返回值-1表示一个错误;返回值0表示EOF

l  write函数:成功返回写的字节数;出错返回-1.

l  不足值:读时遇到EOF;从终端读文本行;读和写的套接字。

 

10.4RIO包健壮的读写

RIO包会自动处理不足值。

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

l  RIO的带缓冲的输入函数:

n  调用包装函数(rio_readlineb),它从一个内部缓冲区拷贝一个文本行,当缓冲区变空时,会自动的调用read系统调用来重新填满缓冲区。在带缓冲区的版本中,每打开一个描述符都会调用一次rio_readinitb函数,它将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。rio_readinitb函数从文件rp读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并且用空字符来结束这个文本行。

n  RIO读程序的核心是rio_read函数,rio_read函数可以看成是Unix read函数的带缓冲区的版本。当调用rio_read要求读取n个字节的时候,读缓冲区内有rp->rio_cnt个未读的字节。如果缓冲区为空的时候,就会调用read系统函数去填满缓冲区。这个read调用收到一个不足值的话并不是一个错误,只不过读缓冲区的是填充了一部分。一旦缓冲区非空,rio_read就从读缓冲区拷贝n和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝字节的数目。

 

10.5读取文件元数据

Int stat(const char *filename, struct stat *buf)

Int fstat(int fd ,struct stat *buf)

 

Stat以文件名作为输入,fstat以文件描述符作为输入

 

10.6共享文件

描述符表 文件表 v-node表

 

10.7 I/O重定向

unix>LS>foo.txt

使外壳加载和执行ls程序,将标准输出定向到磁盘文件

 

 

 

问题:RIO带缓冲的输入,rio_ readlineb函数感觉讲的很抽象。

 

 

 

各个系统调用的参数和返回值汇总

l  int open (char *filename, int flags, mode_t mode)

n  返回:若成功则为新文件描述符,若出错则为-1.

n  Flags参数指明了进程打算如何访问这个文件(O_EDONLY、O_WRONLY、O_RDWR、O_CREAT、O_TRUNC、O_APPEND)

n  Mode参数指定了新文件的访问权限位

 

l  int close(int fd)

n  返回:若成功则为0,若出错则为-1

 

l  ssize_t read(int fd, void *buf, size_ n)

n  返回:若成功则为读的字节数,若EOF则为0,若出错为-1

l  ssize_t write(int fd, const void *buf, size_t n)

n  返回:若成功则为写的字节数,若出错则为-1

 

l  ssize_t rio_readn(int fd, void *usrbuf, size_t n)

ssize_t rio_writen(int fd, void *usrbuf, size_t n)

n  返回i:若成功则为传递的字节数,若EOF则为0(只对rio_readn而言),若出错则为-1.

l  ssize_t rio_readlineb(rio_t *rp, void *usibuf,size_t maxlen)

ssize_t rio_readnb(rio_t *ro, void *usrbuf, size_t n)

n  返回:若成功则为读的字节数,若EOF则为0,若出错则为-1.

 

l  int stat(const char *filename, struct stat *buf)

int fstat(int fd ,struct stat *buf)

n  返回:若成功则返回iu,若出错则为-1

n  Stat以文件名作为输入,fstat以文件描述符作为输入

 

转载于:https://www.cnblogs.com/haikong/p/4947265.html

你可能感兴趣的文章
怎样自动生成makefile
查看>>
Windows2008R2 AD降级错误解决方案
查看>>
datagridview的数据库设计与使用
查看>>
资源管理器的学习笔记一
查看>>
JAVA中写时复制(Copy-On-Write)Map实现
查看>>
推荐12个漂亮的 CSS3 按钮实现方案
查看>>
顺序栈
查看>>
[译] OpenStack Kilo 版本中 Neutron 的新变化
查看>>
Lintcode: Sqrt(X)
查看>>
iOS:UIPageViewController翻页控制器控件详细介绍
查看>>
网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)...
查看>>
SQLServer游标(Cursor)简介和使用说明
查看>>
iOS: ios视频播放(MPMediaPlayerController,AVPlayer,AVPlayerViewcontroller、ffmpeg-AVPlayer)...
查看>>
asp.net中实现登陆的时候用SSL
查看>>
Git常用命令总结【转】
查看>>
PostgreSQL中的AnyEnum例子
查看>>
Delphi 中的 XMLDocument 类详解(14) - 遍历 XML 文件
查看>>
《gradle 用户指南》中文版 第2章 概述
查看>>
Dockerfile指令
查看>>
FFmpeg 学习资料
查看>>