IO 프로 세 스 중 IO 벡터 iovec
3851 단어 iovec
디스크 에서 데 이 터 를 읽 는 효율 을 높이 기 위해 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(
실례
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 미 현지 화 버 전 허가 협 의 를 공유 하여 허가 합 니 다.