分散-聚集I/O

include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/uio.h>

int main(){
int fd = open("test", O_RDWR);

char *buf[] = {"abcdefg\n",
"abcdefgh\n",
"abcdefghi\n"};

struct iovec iov[3];

int i, nr, j;

for(i = 0; i < 3; i++){
iov[i].iov_base = buf[i];
iov[i].iov_len = strlen(buf[i]+1);
}

ftruncate(fd, 0);

nr = writev(fd, iov, 3);

close(fd);

fd = open("test", O_RDWR);

char a[10], b[11], c[12];

iov[0].iov_base = a;
iov[0].iov_len = sizeof(a);
iov[1].iov_base = b;
iov[1].iov_len = sizeof(b);
iov[2].iov_base = c;
iov[2].iov_len = sizeof(c);

nr = readv(fd, iov, 3);

printf("%d %d\n", (int)iov[0].iov_base, (int)a);

for(i = 0; i < 3; i++){
printf("%s", (char*)iov[i].iov_base);
}

close(fd);

return 0;
}

和多次的线性I/O相比,向量I/O不仅减少了系统调用的次数,而且可以经过内核的优化提供性能的改善。一个进程可以执行单次向量操作不会与另一个进程的操作交叉在一起的风险内核动态分配内部数据结构表示每个区段,但是如果小于8的话,内核会在它使用的堆栈上为段创建一个小型的数组,大小为8,这时就不需要动态分配了。

posted @ 2011-10-11 08:39  GG大婶  阅读(323)  评论(0编辑  收藏  举报