原打算实践简单的模型的时候,主要专注于主要的模型,先用UNIX I/O糊弄下,但是未封装的read和write用起来实在心累,还是直接用前辈们已经实现好的高级版本read、write。
UNIX I/O read、write
#include<unistd.h>
ssize_t read(int fd, void* buf, size_t n);
若成功则为读的字节数,若EOF则为0,若出错则为-1;
ssize_t write(int fd, const void* buf, size_t n);
若成功则为写的字节数,若出错则为-1
buf被拷贝的位置,n最大拷贝的字节数,fd描述符
在某些情况下,read和write由于各种原因会传送比预估要少的字节数(short count),但是有些时候这个并不是由于错误造成的,还可能由于以下几个原因。
1、读时遇到EOF: 假设我们准备读一个文件,该文件从当前文件位置开始只含有30个字节,而我们以60个字节的片进行读取(一般情况下重复调用read、write传入的n固定)。这样下来,返回值为30,此后再读的时候通过返回0来发出EOF信号。
2、从终端读,每个read函数将以此传送一个文本行。(此时会不断的返回,然后不断再次调用,封装read后可以直接智能处理这种情况)。
3、读和写网络套接字(socket)。内部缓冲约束、和网络延时(上面红色部分提到)会影响read和write提前返回。
非网络情况下,直接读本地文件,read、和write基本上不会遇到非EOf的(short count)情况。
高级I/O
非缓冲版本(并不是没有内核缓冲、是没有内核缓冲之上的二级缓冲)
这些函数直接在存储器和文件之间传送数据,没有应用级缓冲。它们对将二进制数据读写到网络和从网路读写二进制数据尤其有用。
<