トップ «前の日記(2006-07-03 [月]) 最新 次の日記(2006-07-05 [水])» 編集

SewiGの日記

2004|01|04|05|06|07|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|

2006-07-04 [火] [長年日記]

[Programming] 集合書き込みと拡散読み出し(2)

で、集合書き込みで書き出したデータを読み込む方法を考えます。拡散読み出し(scatter read)は、集合書き込みとは逆にiovecにデータを格納します。

ssize_t readv(int  fildes,  const  struct  iovec  *iov,  int  iovcnt);

writevとほとんど同じですね。ただ、どういうバッファを書き込んだかを読み込む側が知っている必要があります。なので、引数に渡す前に、iov_lenにバッファ長をセットしておきます。

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

int main() {
	int i;
	int fd;
	int iovcnt;
	struct iovec iov[3];
	char buffer1[5];
	char buffer2[19];
	char buffer3[3];

	iov[0].iov_base = buffer1;
	iov[0].iov_len = 4;
	iov[1].iov_base = buffer2;
	iov[1].iov_len = 18;
	iov[2].iov_base = buffer3;
	iov[2].iov_len = 2;

	iovcnt = sizeof(iov) / sizeof(struct iovec);

	fd = open("hoge.txt", O_RDONLY);
	readv(fd, iov, iovcnt);
	close(fd);

	for (i = 0; i < 3; i++) {
		iov[i].iov_base[iov[i].iov_len] = '\0';
		printf("%s", iov[i].iov_base);
	}
	printf("\n", iov[i].iov_base);

	return 0;
}

Copyright © 2004-2008 SewiG All rights reserved.