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 함수 예제  (0) 2012.08.06
writev 함수 예제  (0) 2012.07.31
readv 함수 예제  (0) 2012.07.30
poll 함수 예제  (0) 2012.07.26
GCC 컴파일러 에러 메세지 리스트(Error Message List)  (0) 2012.07.24
select 함수 예제  (0) 2012.07.23

+ Recent posts