Rio包 健壮读和写(一)

RIO包:Robust I/O 包 健壮包。
此包主要提供高效 方便 健壮的I/O读取方式。RIO提供了两类不同的函数:
1 无缓冲的输入输出函数:这个函数直接在存储器和文件之间传送数据,没有应用级缓冲。(主要应用于 二进制数据读写到网络 网络读写至二进制数据中)。
2 带缓冲的输入函数:这个函数允许高效地从文件中读取文本行和二进制数据,这些文件的内容首先被缓冲至应用级缓冲区内,类似于为printf打印区提供的缓冲区,RIO带缓冲输入函数,在同一个描述符上可以被交错地调用,例:先读取一些文本行,稍后再读取二进制数据


Rio的无缓冲的输入输出函数:
ssize_t rio_readn(int fd,void * usrbuf,size_t n); 若EOF 则返回0 出错则返回-1。
ssize_t rio_writen(int fd,void * usrbuf,size_t n); 若成功则返回传送的字节数 否则出错则返回-1。
rio_readn函数的功能是:从fd的当前文件位置最多传送n个字节到存储器位置usrbuf。
rio_writen函数的功能是:从位置usrbuf传送n个字节到描述符fd

ssize_t rio_readn(int fd,void * usrbuf,size_t n){
size_t left =n;
ssize_t nread;
char *bufp = usrbuf;

while(nleft >0)
{
if((read =read(fd,bufp,nleft)<0){ if(errno ==EINTR) { nread =0;//遇到中断异常时,此次执行失败,但是继续执行while 循环执行程序 }else { return -1; } }else if(read ==0){ break; //已经读到文件末尾 } nleft -=nread; bufp +=nread; } return (n-nleft); }


ssize_t rio_writen(int fd,void *usrbuf,size_t n){
size_t nleft = n;
ssize_t nwriten;
char *bufp = usrbuf;

while(nleft >0){
if((written =write(fd,bufp,nleft)) <=0){ if(errno == EINTR){ nwritten =0; //遇到中断异常时,此次执行失败,但是继续执行while 循环执行程序 }else { return 0; } } nleft -=nwriten; bufp +=nwriten; } return n; }



rio 无缓冲函数的原理就是当遇到中断时,当次操作报异常,但是while 循环继续执行读取和写入操作,执行完成n个字节的读取和写入。