现在的位置: 首页 > 综合 > 正文

UNIX环境高级编程读书笔记(十二)—高级IO (4)

2014年01月27日 ⁄ 综合 ⁄ 共 1629字 ⁄ 字号 评论关闭

 

四、存储映射I/O

       存储映射I/O使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区,则相应字节自动地写入文件。这样就可以在不使用readwrite的情况下执行I/O

 

6.

名称:

mmap

功能

I/O文件映射到一个存储区域中

头文件

#include <sys/mman.h>

函数原形

void *mmap(void *addr,size_t len,int prot,int flag,int filedes,off_t off);

参数

addr      指向映射存储区的起始地址

len       映射的字节

prot      对映射存储区的保护要求

flag      flag标志位

filedes    要被映射文件的描述符

off       要映射字节在文件中的起始偏移量

返回值:

若成功则返回映射区的起始地址,若出错则返回MAP_FAILED

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  addr参数用于指定映射存储区的起始地址。通常将其设置为0,这表示由系统选择该映射区的起始地址。

       filedes指要被映射文件的描述符。在映射该文件到一个地址空间之前,先要打开该文件。len是映射的字节数。

       off是要映射字节在文件中的起始偏移量。通常将其设置为0

       prot参数说明对映射存储区的保护要求。可将prot参数指定为PROT_NONE,或者是PROT_READ(映射区可读),PROT_WRITE(映射区可写),PROT_EXEC(映射区可执行)任意组合的按位或,也可以是PROT_NONE(映射区不可访问)。对指定映射存储区的保护要求不能超过文件open模式访问权限。

       flag参数影响映射区的多种属性:    

MAP_FIXED 返回值必须等于addr.因为这不利于可移植性,所以不鼓励使用此标志。

MAP_SHARED 这一标志说明了本进程对映射区所进行的存储操作的配置。此标志指定存储操作修改映射文件。

MAP_PRIVATE 本标志导致对映射区建立一个该映射文件的一个私有副本。所有后来对该映射区的引用都是引用该副本,而不是原始文件。

要注意的是必须指定MAP_FIXEDMAP_PRIVATE标志其中的一个,指定前者是对存储映射文件本身的一个操作,而后者是对其副本进行操作。

 

7

名称:

memcpy

功能

复制映射存储区

头文件

#include <string.h>

函数原形

void *memcpy(void *dest,const void *src,size_t n);

参数

dest       待复制的映射存储区

src        复制后的映射存储区

n          待复制的映射存储区的大小

返回值:

返回dest的首地址

      

 

 

 

 

 

 

 

 

 

 

  memcpy拷贝n个字节从destsrc

 

8

名称:

munmap

功能

解除存储映射

头文件

#include <sys/mman.h>

函数原形

int munmap(caddr_t addr,size_t len);

参数

addr      指向映射存储区的起始地址

len       映射的字节

返回值:

若成功则返回0,若出错则返回-1

     

 

 

 

 

 

 

 

 

 

进程终止时,或调用了munmap之后,存储映射区就被自动解除映射。关闭文件描述符filedes

并不解除映射区。

       munmap不会影响被映射的对象。

 

下面就是利用上面的两个函数实现的第二个版本的cp命令。

/*12_5.c*/

#include <unistd.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <sys/stat.h>

#include <sys/types.h>

 

int main(int argc,char *argv[])

{

int fdin,fdout;

void *arc,dst;

抱歉!评论已关闭.