http://www./article.asp?id=18
名稱:readv/writev 功能:散布讀/聚集寫頭文件:#include <sys/uio.h> 函數(shù)原形: ssize_t readv(int filedes,const struct iovec *iov,int iovcnt); ssize_t writev(int filedes,const struct iovec *iov,int iovcnt); 參數(shù):filedes 文件描述符 iov 指向iovec結(jié)構(gòu)數(shù)組的一個指針。 iovcnt 數(shù)組元素的個數(shù) 返回值:若成功則返回已讀、寫的字節(jié)數(shù),若出錯則返回-1 readv和writev函數(shù)用于在一次函數(shù)調(diào)用中讀、寫多個非連續(xù)緩沖區(qū)。有時也將這兩個函數(shù)成為散布讀和聚集寫。 這兩個函數(shù)的第二個參數(shù)是指向iovec結(jié)構(gòu)數(shù)組的一個指針: struct iovec{ void *iov_base; size_t iov_len; }; writev以順序iov[0]至iov[iovcnt-1]從緩沖區(qū)中聚集輸出數(shù)據(jù)。writev返回輸出的字節(jié)總數(shù),通常,它應(yīng)等于所有緩沖區(qū)長度之和。 readv則將讀入的數(shù)據(jù)按上述同樣順序散布讀到緩沖區(qū)中。readv總是先填滿一個緩沖區(qū),然后再填寫下一個。readv返回讀到的總字節(jié)數(shù)。如果遇到文件結(jié)尾,已無數(shù)據(jù)可讀,則返回0。 下面就是讀多個緩沖區(qū)的例子: /*12_4.c*/ #include <sys/uio.h> #include <stdio.h> #include <fcntl.h> int main(int argc,char *argv[]) { ssize_t size; char buf1[9]; char buf2[9]; struct iovec iov[2]; fd1=open(argv[1],O_RDONLY); fd2=open(argv[2],O_RDONLY); fd3=open(argv[3],O_WRONLY); size=read(fd1,buf1,sizeof(buf1)); printf(“%s size is:%d\n”,argv[1],size); size=read(fd2,buf2,sizeof(buf2)); printf(“%s size is:%d\n”,argv[2],size); iov[0].iov_base=buf1; iov[0].iov_len=sizeof(buf1); iov[1].iov_base=buf2; iov[1].iov_len=sizeof(buf2); size=writev(fd3,iov,2)); printf(“%s size is:%d\n”,argv[3],size); close(fd1); close(fd2); close(fd3); } 先用vi或cat建立三個文件(test1,test2,test3),test寫入123456789,test寫入abcdefghi. test3為空。 然后運行命令: #./12_4 test1 test2 test3 在屏幕上會輸出: test1 size is:9 test2 size is:9 test3 size is:18 打開test3,文件內(nèi)容為123456789abcdefghi. 程序先把test1和test2的內(nèi)容分別讀到緩沖區(qū)buf1和buf2中。然后用write把buf1和buf2的內(nèi)容寫至test3. |
|