readv & writev 함수의 사용  시스템프로그래밍 

2013.03.28. 21:53  수정  삭제

복사http://blog.naver.com/pwk0810/40185592042

전용뷰어 보기

데이터 송수신의 효율성 향상시키는데 도움이 되는 함수들.

 

데이터를 모아서 전송하고 , 모아서 수신하는 함수

 

#include <sys/uio.h>

 

ssize_t writev(int filedes,  const struct iovec * iov, int iovcnt);

 

 

  • iov : 구조체 iovec 배열의 주소값 전달 , 구조체 iovec 의 변수에는 전송할 데이터의 위치 및 크기 정보가 담긴다.

  • int main()


struct iovec vec[2]]


buf1 = abcd..;
buf2 = 1234567;

vec[0].iov_base = buf1;
vec[0].iov_len = 3;

vec[0].iov_base = buf2;
vec[0].iov_len = 3;

str_len = writev(1,vec, 2);

put() = ABC123 
str_len = 6;

 




+ readv & writev  함수의 적절한 사용
  • 전송해야 할 데이터가 여러개의 버퍼(배열) 에 나뉘어 있는 경우, 모든 데이터의 전송을 위해서는 여러번의 write 함수 호출이 요구되는데 , 이를 딱 한번의 wrtie 함수 호출로 대신할수 있어 효율적이다.
  • WriteV함수는 nagle 알고리즘이 중지된 상황에서 더 활용의 가치가 높다.


read, write와 기본적으로 동일하나, 다수의 버퍼의 데이터를 한번에 출력/기록 할 수 있다.

Prototype
 

int  writev( int fd, struct iovec iov[], int iovcount );
int  readv( int fd, struct iovec iov[], int iovcount );

struct iovec {
caddr_t iov_base; // 버퍼의 시작 포인터
int lov_len; // 버퍼의 바이트 사이즈
}


sample code

struct iovec iov[3];

iov[0].iov_base = buf1;
iov[0].iov_len = strlen(buf1);

iov[1].iov_base = buf2;
iov[1].iov_len = strlen(buf2);

iov[2].iov_base = buf3;
iov[2].iov_len = strlen(buf3);

writev( fd, &iov[0], 3 );






 

<script src="http://iich.tistory.com/plugin/CallBack_bootstrapper?&src=http://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=103&callbackId=iichtistorycom1035709&destDocId=callbacknestiichtistorycom1035709&host=http://iich.tistory.com&float=left&random=729"></script>
Posted by 뉴암스테르담
l