信息安全系统设计基础第八周学习总结
第十章系统级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.4用RIO包健壮的读写
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以文件描述符作为输入