RIO包健壮地读写
函数式RIO包提供两类不同的函数:
1、不带缓冲的输入输出函数:这些函数直接在存储器和文件之间传送数据,没有应用级缓冲区。
2、带缓冲的输入函数(注意没有输出函数):文件的内容缓存在(类似于像printf这样的标准I/O函数提供的缓冲区)应用级缓冲区
这里主要针对文件I/O,因为标准I/O本身就是带缓冲的,我们在对文件进行读写操作时,一般会优先使用标准的Io函数,但是在网络编程中,只能使用文件I/O的函数。在网络通信中,这种机制方法运用还是比较多的!
RIO的无缓冲的输入输出函数和平常的I/O函数形式是相同的,但前者可以自动的处理不足值。
关于不足值:
某些情况下,read和write传送的字节比应用程序要求的少。
例如:较长网络延迟和内部缓冲约束,会出现不足值,这样需要用rio包健壮的读写,即多次反复的调用write和read进行读写。直到所有需要的字节都传送完毕。
普通的I/O函数(Unix read/write函数):
ssize_t read(int fd, void *buf, size_t n)
ssize_t write(int fd, const void *buf, size_t n) //ssize_t有符号,size_t无符号
RIO函数(无缓冲的):
ssize_t rio_readn(int fd, void *usrbuf, size_t n)
ssize_t rio_writen(int fd, void *usrbuf, size_t n)
RIO函数(有缓冲的输入函数):
ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n) //usrbuf为存储器位置,rp为缓冲区地址
ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen) //每次读取文本的一行,将它拷贝到存储器位置usrbuf,并且用空(零)字符来结束这个文本行
例:从标准输入拷贝一个文本文件到标准输出
#include"csapp.h"
int main(int argc, char**argv)
{
int n ;
rio_t rio; //读缓冲区
char buf[MAXLINE];
rio_readiniteb(&rio,STDIN_FILENO); //将描述符fd和地址rp处的一个类型为rio_t(rio)的读缓冲区(函数来创建)联系起来
while((n=rio_readlineb(&rio, buf, MAXLINE))!=0)
rio_writen(STDOUT_FILENO,buf, n);
}