SewiGの日記
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; }