《深入理解计算机系统》之Unix I/O函数

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值