分散/聚合I/O是一种可以在单次系统调用中对多个缓冲区输入输出的方法,可以把多个缓冲区的数据写到单个数据流,也可以把单个数据流读到多个缓冲区中。其命名的原因在于数据会被分散到指定缓冲区向量,或者从指定缓冲区向量中聚集数据。这种输入输出方法也称为向量I/O(vector I/O)。与之不同,标准读写系统调用(read,write)可以称为线性I/O(linear I/O)。 与线性I/O相比,分散/聚合I/O有如下几个优势: 1)编码模式更自然 如果数据本身是分段的,向量I/O提供了直观的数据处理方法。 2)效率更高 单个向量I/O操作可以取代多个线性I/O操作。 3)性能更好 除了减少了发起的系统调用次数,通过内部优化,向量I/O可以比线性I/O提供更好的性能。 4)支持原子性 和多个线性I/O操作不同,一个进程可以执行单个向量I/O操作,避免了和其他进程交叉操作的风险。 函数原型:
ssize_t readv(int fd, const struct iovec *iov, int iovcnt); ssize_t writev(int fd, const struct iovec *iov, int iovcnt); ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset); 分散输入(scatter input)-聚合输出(gather output)。 struct iovec { void *iov_base; /*Starting address,向量缓冲区地址*/
ssize_t iov_len; /*Number of bytes to transfer,向量缓冲区大小,单位字节*/ } 示例代码:
int main() { char *str0 = "hello"; char *str1 = "world\n"; struct iovec iov[2]; ssize_t nwritten; iov[0].iov_base = str0; iov[0].iov_len = strlen(str0); iov[1].iov_base = str1; iov[1].iov_len = strlen(str1); nwritten = writev(STDOUT_FILENO,iov,2); return 0; } |
|