NGX的编码很优秀。之前详细介绍了sendfile的应用,完成“运行内存零拷贝”。今天学习了writev函数的应用。以nginx-1.6.0为例,在src/os/ss="superseo">ss="superseo">unix/ngx_writev_chain.c的第113行,如下图:
Man2writev可以看看函数的概念(还有一个readv对应writev)。Writev加载几个不连续的缓冲区,然后集中加载。
#include <sys/uio.h> ssize_t readv(int fd, const struct iovec *vector, int count); ssize_t writev(int fd, const struct iovec *vector, int count);如何收尾?
#include <stdio.h> #include <fcntl.h> #include <sys/uio.h> int main(int argc,char *argv[]) { int fd1,fd2,fd3; ssize_t size; char buf1,buf2[9]; struct iovec iov[2]; fd1=open(argv[1],O_RDONLY); fd2=open(argv[2],O_RDONLY); fd3=open(argv[3],O_RDWR); size=read(fd1,buf1,sizeof(buf1)); printf("%s size is : %d\n",argv[1],size); size=read(fd2,buf2,sizeof(buf2)); printf("%s size is : %d\n",argv[2],size); iov[0].iov_base=buf1; iov[0].iov_len=sizeof(buf1); iov[1].iov_base=buf2; iov[1].iov_len=sizeof(buf2); size=writev(fd3,iov,2); printf("%s size is :%d\n",argv[3],size); close(fd1); close(fd2); close(fd3); }首先,建立三个文档,文件1(9字节)、文件2(9字节)和文件3(空文档)。程序流从文件1和文件1中读取缓冲区,然后将几个缓冲区加载到新的fd中。
编译程序并测试它。
[9]
writev和write函数的区别取决于几个非持久缓冲区的加载。当负载较重时,它可以很好地反映功能的实际效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)