信息安全系统设计基础第八周学习总结

第十章系统级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以文件描述符作为输入

 

posted @ 2015-11-08 14:18  20135329李海空  阅读(189)  评论(0编辑  收藏  举报