read 함수와 매우 동일한 함수다.
NAME
readv, writev - read or write data into multiple buffers
SYNOPSIS
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
리턴값 : 성공시 전송한 바이트 수, 실패시 -1 리턴
인자값 :
- fd : 데이터 전송의 목적지를 나타내는 소켓의 파일 디스크립터를 전달한다.
반드시 소켓에만 제한되는 함수가 아니다. read, write 함수처럼 파일이나
콘솔을 입, 출력 대상으로 할 수도 있다.
- vector : 일반적으로 iovec 구조체 배열의 이름을 인자로 전달하는데, iovec 구조체에는
전송하고자 하는 데이터에 대한 정보가 담겨진다.
- count : 데이터를 전송하기 위해 참고할 iovec 구조체 변수의 수를 지정한다. 만약에 3이 인자로
전달되면, vector가 가리키는 iovec 구조체 변수를 시작으로 총 3개의 iovec 변수를 참고하여
데이터를 전송하게 된다.
iovec (I/O vector)의 구조체는 /etc/include/sys/uio.h 에 선언되어있다.
struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes to transfer */
}
간략한 예제는 다음과 같다.
=====================================
#include#include #include #include #include int main () { char foo[48], bar[51], baz[49]; struct iovec iov[3]; ssize_t nr; int fd, i; fd = open ("test.txt", O_RDONLY); if (fd == -1) { perror ("open"); return 1; } /* set up our iovec structures */ iov[0].iov_base = foo; iov[0].iov_len = sizeof (foo); iov[1].iov_base = bar; iov[1].iov_len = sizeof (bar); iov[2].iov_base = baz; iov[2].iov_len = sizeof (baz); /* read into the structures with a single call */ nr = readv (fd, iov, 3); if (nr == -1) { perror ("readv"); return 1; } for (i = 0; i < 3; i++) printf ("%d ==>> %s\n", i, (char *) iov[i].iov_base); if (close (fd)) { perror ("close"); return 1; } return 0; }
시험결과는 다음과 같다. $ ./a.out 0 ==>> LONDON ? The swimmer Dana Vollmer is an unabashe? 1 ==>> d fan of the gymnasts Shannon Miller and Nastia LiuLONDON ? The swimmer Dana Vollmer is an unabashe? 2 ==>> kin, which makes sense. Miller and Liukin won Olyd fan of the gymnasts Shannon Miller and Nastia LiuLONDON ? The swimmer Dana Vollmer is an unabashe?
=====================================
3개의 버퍼를 선언하는데 48, 51, 49 byte로 각기 다른 사이즈로 했다.
1번째 줄은 49 byte 출력
2번째 줄은 100byte 출력
3번째 줄은 149byte 출력
버퍼보다 사이즈가 하나 더 늘어나서 출력되는 것 같은데
마지막에 ? (물음표)가 더해졌다. 이유는 아직 잘 모르겠다. OTL..
'Language > C' 카테고리의 다른 글
strtok 함수 예제 (3377) | 2012.08.06 |
---|---|
writev 함수 예제 (472) | 2012.07.31 |
poll 함수 예제 (150) | 2012.07.26 |
GCC 컴파일러 에러 메세지 리스트(Error Message List) (159) | 2012.07.24 |
select 함수 예제 (167) | 2012.07.23 |