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

  • Post author:
  • Post category:其他


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。



版权声明:本文为sun_z_x原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。