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

+ Recent posts