标签:
I/O:在主存和外部设备之间拷贝数据的过程。
一个Unix文件就是一个m个字节的序列:
B0,B1,B2…Bk…B(m-1)
1.所有的输入输出都能以一种统一且一致的方式来执行:
(1)打开文件
a.描述符:内核返回一个小的非负整数,它在后续对此文件的所有操作中标识这个文件。
b. Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)、标准错误(描述符为2)。
(2)改变当前的文件设置。
(3)读写文件
end-of-file (EOF)
(4)关闭文件。
1.int open(char *filename, int flags, mode_t mode)
2.open函数将filename转换为一个文件描述符。Flags参数指明了进程打算如何访问文件。O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(可读可写)、O_CREAT、O_TRUNC、O_APPEND。mode参数指定了新文件的访问权限位。
1. read函数:返回值-1表示一个错误;返回值0表示EOF
2. write函数:成功返回写的字节数;出错返回-1.
3. 不足值:读时遇到EOF;从终端读文本行;读和写的套接字。
RIO包会自动处理不足值。
1.RIO的无缓冲的输入输出函数:在存储器和文件之间直接传送数据。
2.RIO的带缓冲的输入函数:
3.调用包装函数(rio_readlineb),它从一个内部缓冲区拷贝一个文本行,当缓冲区变空时,会自动的调用read系统调用来重新填满缓冲区。在带缓冲区的版本中,每打开一个描述符都会调用一次rio_readinitb函数,它将描述符fd和地址rp处的一个类型为rio_t的读缓冲区联系起来。rio_readinitb函数从文件rp读取一个文本行(包括结尾的换行符),将它拷贝到存储器位置usrbuf,并且用空字符来结束这个文本行。
4.RIO读程序的核心是rio_read函数,rio_read函数可以看成是Unix read函数的带缓冲区的版本。当调用rio_read要求读取n个字节的时候,读缓冲区内有rp->rio_cnt个未读的字节。如果缓冲区为空的时候,就会调用read系统函数去填满缓冲区。这个read调用收到一个不足值的话并不是一个错误,只不过读缓冲区的是填充了一部分。一旦缓冲区非空,rio_read就从读缓冲区拷贝n和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝字节的数目。
Int stat(const char *filename, struct stat *buf)
Int fstat(int fd ,struct stat *buf)
Stat以文件名作为输入,fstat以文件描述符作为输入
1.描述符表 文件表 v-node表
1.unix>LS>foo.txt
使外壳加载和执行ls程序,将标准输出定向到磁盘文件
参考资料:《深入理解计算机系统》
标签:
原文地址:http://www.cnblogs.com/lv-20135229/p/4947637.html