为什么这样写:readline()

这里就不贴代码了。代码来自《UNIX 网络编程》第一卷(3rd edition)P73,P75

具体来看看为什么要这样写。

这是两个函数:P73的readline() Version 1;P75的readline() Version 2。

readline() Version 1

P73
代码都是普通的C语言代码,关键是作者这样写的思路是啥,为什么要这样写但是后来却把这个版本的代码给升级了。
而且还说这个版本的代码是“及其慢的”
对于这个版本的代码,想象一下,假设你要读取64字节的文本,在for循环里面:rc = read( fd, &c, 1),意味着每读取一个字节过后都要再次调用系统调用read重新读取下一个字节。直到读取完成总共要进行64次系统调用过程。这是恐怖的。当数据量上升时,系统性能肯定会大幅下降。然后: *ptr++ = c,很显然就是把读到了每一个字节放到缓冲区里面。

readline() Version 2

P75
第二个版本进行了升级,解决了那个频繁调用read系统调用的问题。
怎么解决的?这个就在另外一个函数:my_read实现的了。
关于函数my_read()这里使用了一个控制变量read_cnt,控制什么?怎么控制的?控制的就是频繁调用read。怎么控制?第一条语句if( read_cnt <= 0 )说明了当my_read函数的内部缓冲区中得数据被readline读取完了才进行read系统调用。
代码:
     read_cnt--;
     *ptr = *read_ptr++;//每次读取一个字符,转移一个字符  
     return(1); 
要读取的字节数减少1,然后,每次从内部缓冲区read_buf读取一个字节,复制到readline的缓冲区,
达到的效果是每次读取一个字节,而且避免了频繁地系统调用


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值