readv函数和writev函数
readv
函数将数据从文件描述符读到分散的内存块中,即分散读;
writev
函数则将多块分散的内存数据一并写人文件描述符中,即集中写。它们的定义如下:
1 |
|
fd
被操作的目标文件描述符。
iov
是iovec
类型的数组,在recvmsg
和sendmsg
中接触过。
iovcnt
是iov
数组的长度。
iovec
结构体封装了一块内存的起始位置和长度。
1 | struct iovec { /* Scatter/gather array items */ |
readv
和 writev
在成功时返回读出/写入fd
的字节数,失败则返回-1并设置errno。
readv
和writev
是个非常有用的函数。比如:当Web服务器解析完一个HTTP请求之后,如果目标文档存在且客户具有读取该文档的权限,那么它就需要发送一个HTTP应答来传输该文档。这个HTTP应答包含1个状态行、多个头部字段、1个空行和文档的内容。其中,前3部分的内容可能被Web服务器放置在一块内存中,而文档的内容则通常被读入到另外一块单独的内存中(通过read函数或mmap函数)。我们并不需要把这两部分内容拼接到一起再发送,而是可以使用writev函数将它们同时写出。
举一个man手册上writev
函数的例子
1 |
|