系统级I/O
输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程。
输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备、。
所有的输入输出都被当做对相应的文件的读和写来执行。
一、Unix I/O
1.打开文件:一个应用程序通过要求内核打开相应的文件,来宣告它想要访问的一个I/O设备。
内核返回的小的非负整数叫做描述符。
2.改变当前的文件位置:对于每个打开的文件,内核保持着一个文件位置K,初始为0,。这个文件位置是从文件开头起始的字节偏移量
3.读写文件:读操作就是从文件中拷贝n>0个字节到存储器,从当前文件位置开始K开始,然后将K增加到K+N。
4.关闭文件:当应用完成了对文件的访问之后,就通知内核关闭这个文件,作为响应,内核释放文件打开时创建的数据结构,并将描述符恢复到可用描述符池中。
二、打开和关闭文件
1.open函数将filename转化为文件描述符,并且返回描述符数字(为当前没有打开的最小描述符)
2.flag参数表示进程打算如何访问文件:
只读O_RDONLY
只写O_WRONLY
可读可写O_RDWR
3.mode参数表示指定了新文件的访问权限位
作为上下文的一部分,每个进程都有一个umask,通过调用来实现的
三、读和写文件
1.read函数从描述符为fd的当前文件位置拷贝最多N个字节到存储器位置buf
返回值为-1表示一个错误
返回值为0表示EOF
否则返回值表示实际传送的字节数量
2.write函数从存储器位置buf拷贝至多N个字节到fd的当前文件位置
四、用RIO包健壮的读写
RIO:自动处理不足值,提供两类函数
无缓冲的输入输出函数。这些函数直接在存储器和文件之间传送数据,没有应用级缓冲。
带缓冲的输入函数。这些函数允许高效的从文件中读取文本行和二进制数据,文件内容缓存在应用级缓冲区中。
1.无缓冲的输入输出函数:rio_readen,rio_writen函数
2.带缓冲的输入函数:一种方法是用read函数来一次一个字节地从文件传送到用户存储器,检查每个字节来查找换行符。缺点是效率不是很高,读取一个字节都要求陷入内核;一种方法是调用一个包装函数rio_readlineb,它从一个内部读缓冲区拷贝一个文本行,当缓冲区变空,会自动调用read重新填满缓冲区。
3.RIO读程序的核心是:rio_read函数
调用该函数时,要求读N个字节。如果缓冲区为空,那么会调用read填满。如果缓冲区非空,函数就得从读缓冲区拷贝N和rp->rio_cnt中较小值个字节到用户缓冲区,并返回拷贝的字节数。
五、读取文件元数据
1.stat函数:以一个文件名作为输入,填写成员,主要讨论st_mode,st_size
st_size:包含了文件的字节数大小
st_mode:编码了文件访问的许可位
Unix提供的宏指令根据st_mode成员来确定文件的类型
六、共享文件
描述符表
文件表
v-node表
七、I/O重定向
UNIX外壳提供了I/O重定向操作符,允许用户将磁盘文件和标准输入输出联系起来
(图10-14)
问题:共享文件一节里10-13图的理解不懂,第一节,第二节的示例代码中一些语句不懂。
感想:本章的内容大多限定在定义概念,看懂代码还需要多下功夫