unix中readn()与readline 的作用,,write,,read,,readn

read(int fd,void *buf,size_t  n),write(int fd,void *buf,size_t  n).

是系统自己实现的库函数。。

readn(int fd,void *buf,size_t  n),writen(int fd,void *buf,size_t  n).readline();

是自己实现的函数


为什么要实现readn,writen,readline呢?


1.read成功返回时,返回值an《=0;

当n=0时,表示到达文件末尾;

一般文件an=n;除非快到文件末尾了。。


但是像套接字等可能由于内核中的套接字缓冲区x比较小的原因,导致不能一次返回an=n;

所以要重读,,于是有了readn


writen同理。。


只是write()函数返回an为0时;

(1)当n本身为0,,则可能正常an返回0;或则返回0的同时errno标志一下

(2)当n本身!=0时,,若an=0.。则一定错误。。(可能出现这种情况吗??)


最后readline其实就是为了解决读不固定长度的串,就像fgets()。。以‘\0’结尾的。。

而readn读为n的。。









  如果应用层协议的各字段长度固定,用readn来读是非常方便的。例如设计一种客户端上传文件的协议,规定前12字节表示文件名,超过12字节的文件名截断,不足12字节的文件名用'\0'补齐,从第13字节开始是文件内容,上传完所有文件内容后关闭连接,服务器可以先调用readn读12个字节,根据文件名创建文件,然后在一个循环中调用read读文件内容并存盘,循环结束的条件是read返回0。

       字段长度固定的协议往往不够灵活,难以适应新的变化。前面讲过的TFTP协议的各字段是可变长的,以'\0'为分隔符,文件名可以任意长,再看blksize等几个选项字段,TFTP协议并没有规定从第m字节到第n字节是blksize的值,而是把选项的描述信息“blksize”与它的值“512”一起做成一个可变长的字段。

       因此,常见的应用层协议都是带有可变长字段的,字段之间的分隔符用换行'\n'的比用'\0'的更常见,如HTTP协议。可变长字段的协议用readn来读就很不方便了,为此我们实现一个类似于fgets的readline函数。

       首先来看一个跟read 相似的系统函数recv。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值