IO 프로 세 스 중 IO 벡터 iovec

3851 단어 iovec
저자:Younger Liu,본 작품 은 지식 공유 서명-비상 업적 사용-동일 한 방식 으로 3.0 미 현지 화 버 전 허가 협 의 를 공유 하여 허가 합 니 다.
디스크 에서 데 이 터 를 읽 는 효율 을 높이 기 위해 IO 벡터 체 제 를 도입 했다.IO 벡터 는 struct iovec 이 고 API 인 터 페 이 스 는 readv 와 writev 에서 사용 되 며 물론 다른 곳 에서 도 많이 사용 된다.벽돌 을 던 져 옥 을 끌 어 들 여 iovec 에 대한 자신의 이 해 를 이야기 하 다.
 
readv & writev
     readv 인터페이스:파일 설명자 fd 에 대응 하 는 파일 에서 count 데이터 세그먼트 에서 여러 buffers 로 읽 습 니 다.이 buffer 는 iovec 로 설명 합 니 다.원형:
#include
 
ssize_t readv(int fd,const struct iovec *iov, int count);
     writev 인터페이스:count 데이터 버퍼(iovec 설명 사용)를 파일 설명자 fd 에 대응 하 는 파일 에 기록 합 니 다.원형:
#include
 
ssize_t writev(int fd,const struct iovec *iov, int count);
 
 
iovec 설명
struct iovec 는 IO 벡터 가 되 고 그 구 조 는 다음 과 같다.
#include
 
struct iovec{
      void *iov_base; /* pointer to the start of buffer */
      size_t iov_len; /* size of buffer in bytes */
}
분명 해,iovbase 는 하나의 지침 으로 buffer 주소(일반적으로 사용자 상태 주소),iov 를 기록 하 는 데 사 용 됩 니 다.len 은 buffer 의 크기 를 표시 합 니 다.
 
사용자 상태 나 커 널 상태 에서 사용 할 때 보통 포인터 형식 을 사용 합 니 다:struct iovec *iov。물론 일반적으로 그 원소 의 개수 count 도 제시 합 니 다.
어떻게 읽 고 쓰 시 겠 습 니까?iov[0],iov[1],...,iov[count-1]순 으로 읽 고 쓰 며 파일 에 있 는 주 소 는 연속 입 니 다.
반환 값:(1)성공,읽 고 쓴 바이트 수 를 되 돌려 줍 니 다.이 바이트 수 는 모든 iovec 구조 에서 iov 입 니 다.len 의 총화;(2)실패 반환-1,errno 설정.
iov_len 의 총 계 는 SSIZE 를 초과 할 수 없습니다.MAX,count 는 0 보다 크 고 IOV 보다 작 아야 합 니 다.MAX(중),linux 1024, 그렇지 않 으 면-1,errno 를 EINVAL 로 설정 합 니 다. 
 
실례
 writev:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/uio.h>

int main(){
	struct iovec iov[3];
	ssize_t nr;
	int fd,i;
	
	char *buf[] = {
		"The term buccaneer comes from the word boucan.
", "A boucan is a wooden frame used for cooking meat.
", "Buccaneer is the West Indies name for a pirate.
" }; fd = open("buccaneer.txt",O_WRONLY | O_CREAT | O_TRUNC); if( fd == -1 ){ perror("open"); return 1; } for(i = 0; i < 3; i++){ iov[i].iov_base = buf[i]; iov[i].iov_len = strlen(buf[i]); } nr = writev(fd,iov,3); if(nr == -1){ perror("writev"); return 1; } printf("wrote %d bytes
",nr); if(close(fd)){ perror("close"); return 1; } return 0; }

readv:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/uio.h>

int main(){
	char foo[48],bar[51],baz[49];
	struct iovec iov[3];
	ssize_t nr;
	int fd,i;

	fd = open("buccaneer.txt",O_RDONLY);
	if(fd == -1){
		perror("open");
		return 1;
	}

	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);

	nr = readv(fd,iov,3);
	if(nr == -1){
		perror("readv");
		return 1;
	}

	for(i = 0; i < 3; i++){
		printf("%d: %s",i,(char *)iov[i].iov_base);
	}

	if(close(fd)){
		perror("close");
		return 1;
	}
	return 0;
}

 
사 의 를 표 하 다
http://fuliang.iteye.com/blog/652297
 
저자:Younger Liu,본 작품 은 지식 공유 서명-비상 업적 사용-동일 한 방식 으로 3.0 미 현지 화 버 전 허가 협 의 를 공유 하여 허가 합 니 다.

좋은 웹페이지 즐겨찾기