mmap函数用法及示例程序

时间:2022-01-20 16:16:34

UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:
1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;
2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;
3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。


头文件:
   #include <sys/mman.h>

函数:void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);

参数start:指向欲映射的内存起始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。

参数length:代表将文件中多大的部分映射到内存。

参数prot:映射区域的保护方式。可以为以下几种方式的组合:
PROT_EXEC 映射区域可被执行
PROT_READ 映射区域可被读取
PROT_WRITE 映射区域可被写入
PROT_NONE 映射区域不能存取

参数flags:影响映射区域的各种特性。在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE。
MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。
MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。
MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。
MAP_ANONYMOUS建立匿名映射。此时会忽略参数fd,不涉及文件,而且映射区域无法和其他进程共享。
MAP_DENYWRITE只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。
MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。

参数fd:要映射到内存中的文件描述符。如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。

参数offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍。

返回值:

若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。

错误代码:

EBADF 参数fd 不是有效的文件描述词
EACCES 存取权限有误。如果是MAP_PRIVATE 情况下文件必须可读,使用MAP_SHARED则要有PROT_WRITE以及该文件要能写入。
EINVAL 参数start、length 或offset有一个不合法。
EAGAIN 文件被锁住,或是有太多内存被锁住。
ENOMEM 内存不足。
系统调用mmap()用于共享内存的两种方式:

(1)使用普通文件提供的内存映射:

适用于任何进程之间。此时,需要打开或创建一个文件,然后再调用mmap()

典型调用代码如下:

fd=open(name, flag, mode); if(fd<0) ...

ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0);

通过mmap()实现共享内存的通信方式有许多特点和要注意的地方,可以参看UNIX网络编程第二卷。

(2)使用特殊文件提供匿名内存映射:

适用于具有亲缘关系的进程之间。由于父子进程特殊的亲缘关系,在父进程中先调用mmap(),然后调用 fork()。那么在调用fork()之后,子进程继承父进程匿名映射后的地址空间,同样也继承mmap()返回的地址,这样,父子进程就可以通过映射区域进行通信了。注意,这里不是一般的继承关系。一般来说,子进程单独维护从父进程继承下来的一些变量。而mmap()返回的地址,却由父子进程共同维护。对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式。此时,不必指定具体的文件,只要设置相应的标志即可。




#
include
<
unistd.
h>

#
include
<
stdio.
h>

#
include
<
sys/
mman.
h>

#
include
<
fcntl.
h>

#
include
<
stdlib.
h>



//定义存放记录的结构体


typedef
struct

{

    int
index;

//编号


    char
text[
10]
;

//内容


}
RECORD;


#
define
SIZE (
50)

#
define
EDIT_INDEX (
10)


int
main(
void
)

{

     RECORD record,
*
p_mapped_memory_addr;

    int
i,
fd;

    FILE
*
fp;


    

//创建文件并写入测试数据


     fp =
fopen
(
"records.dat"
,
"w+"
)
;

    for
(
i =
0;
i <
SIZE;
i+
+
)

    {

         record.
index =
i;

        sprintf
(
record.
text,
"No.%d"
,
i)
;

        fwrite
(
&
record,
sizeof
(
record)
,
1,
fp)
;

//因为字节序对齐,在32位机上,sizeof(record)=16,并不是14。


    }

    fclose
(
fp)
;

    printf
(
"Ok, write %d records to the file: records.dat ./n"
,
SIZE)
;


    

//将第一30条记录编号修改为300,并相应地修改其内容。


    

//采用传统方式


     fp =
fopen
(
"records.dat"
,
"r+"
)
;

    fseek
(
fp,
EDIT_INDEX *
sizeof
(
record)
,
SEEK_SET
)
;

    fread
(
&
record,
sizeof
(
record)
,
1,
fp)
;


     record.
index =
EDIT_INDEX*
10;

    sprintf
(
record.
text,
"No.%d"
,
record.
index)
;


    fseek
(
fp,
EDIT_INDEX *
sizeof
(
record)
,
SEEK_SET
)
;

    fwrite
(
&
record,
sizeof
(
record)
,
1,
fp)
;

    fclose
(
fp)
;

    printf
(
"Ok, edit the file of records.dat using traditional method./n"
)
;


    

/////////////////////////////////////////


    

//同样的修改,这次使用内存映射方式。


    

//将记录映射到内存中


     fd =
open
(
"records.dat"
,
O_RDWR)
;

     p_mapped_memory_addr =
(
RECORD *
)
mmap(
0,
SIZE *
sizeof
(
record)
,
PROT_READ |
PROT_WRITE,
MAP_SHARED,
fd,
0)
;

    

//修改数据


     p_mapped_memory_addr[
EDIT_INDEX]
.
index =
EDIT_INDEX*
10;

    sprintf
(
p_mapped_memory_addr[
EDIT_INDEX]
.
text,
"No.%d"
,

             p_mapped_memory_addr[
EDIT_INDEX]
.
index)
;


    

/* Synchronize the region starting at ADDR and extending LEN bytes with the
     file it maps. Filesystem operations on a file being mapped are
     unpredictable before this is done. Flags are from the MS_* set.

     This function is a cancellation point and therefore not marked with
     __THROW. extern int msync (void *__addr, size_t __len, int __flags);
     */


    

//将修改写回映射文件中(采用异步写方式)


     msync(
(
void
*
)
p_mapped_memory_addr,
SIZE *
sizeof
(
record)
,
MS_ASYNC)
;

    

/* Deallocate any mapping for the region starting at ADDR and extending LEN
     bytes. Returns 0 if successful, -1 for errors (and sets errno).
     extern int munmap (void *__addr, size_t __len) __THROW;
     */


    

//释放内存段


     munmap(
(
void
*
)
p_mapped_memory_addr,
SIZE *
sizeof
(
record)
)
;

    printf
(
"Ok, edit the file of records.dat using mmap method./n"
)
;


    

//关闭文件


    close
(
fd)
;

    
    return
0;


}


 

 

mmap

  功能描述:

  mmap将mmap函数用法及示例程序个文件或者其它对象映射进内存mmap函数用法及示例程序文件被映射到多个页上mmap函数用法及示例程序如果文件mmap函数用法及示例程序大小不是所有页mmap函数用法及示例程序大小的和mmap函数用法及示例程序最后mmap函数用法及示例程序个页不被使用mmap函数用法及示例程序空间将会清零mmap函数用法及示例程序munmap执行相反mmap函数用法及示例程序操作mmap函数用法及示例程序删除特定地址区域mmap函数用法及示例程序对象映射mmap函数用法及示例程序

  基于文件mmap函数用法及示例程序映射mmap函数用法及示例程序在mmap和munmap执行过程mmap函数用法及示例程序任何时刻mmap函数用法及示例程序被映射文件mmap函数用法及示例程序st_atime可能被更新mmap函数用法及示例程序如果st_atime字段在前述mmap函数用法及示例程序情况下没有得到更新mmap函数用法及示例程序首次对映射区mmap函数用法及示例程序mmap函数用法及示例程序个页索引时会更新该字段mmap函数用法及示例程序mmap函数用法及示例程序用PROT_WRITE 和 MAP_SHARED标志建立起来mmap函数用法及示例程序文件映射mmap函数用法及示例程序其st_ctime 和 st_mtime

  在对映射区写入的后mmap函数用法及示例程序但在msyncmmap函数用法及示例程序通过MS_SYNC 和 MS_ASYNC两个标志mmap函数用法及示例程序的前会被更新mmap函数用法及示例程序

  使用方法:

  #mmap函数用法及示例程序 <sys/mman.h>

  void *mmap(void *start, size_t length, mmap函数用法及示例程序 prot, mmap函数用法及示例程序 flags,

  mmap函数用法及示例程序 fd, off_t offmmap函数用法及示例程序);

  mmap函数用法及示例程序 munmap(void *start, size_t length);

  参数:

  start:映射区mmap函数用法及示例程序开始地址mmap函数用法及示例程序

  length:映射区mmap函数用法及示例程序长度mmap函数用法及示例程序

  prot:期望mmap函数用法及示例程序内存保护标志mmap函数用法及示例程序不能和文件mmap函数用法及示例程序打开模式冲突mmap函数用法及示例程序是以下mmap函数用法及示例程序某个值mmap函数用法及示例程序可以通过or运算合理地组合在mmap函数用法及示例程序

  PROT_EXEC //页内容可以被执行

  PROT_READ //页内容可以被读取

  PROT_WRITE //页可以被写入

  PROT_NONE //页不可访问

  flags:指定映射对象mmap函数用法及示例程序类型mmap函数用法及示例程序映射选项和映射页是否可以共享mmap函数用法及示例程序mmap函数用法及示例程序值可以是mmap函数用法及示例程序个或者多个以下位mmap函数用法及示例程序组合体

  MAP_FIXED //使用指定mmap函数用法及示例程序映射起始地址mmap函数用法及示例程序如果由start和len参数指定mmap函数用法及示例程序内存区重叠于现存mmap函数用法及示例程序映射空间mmap函数用法及示例程序重叠部分将会被丢弃mmap函数用法及示例程序如果指定mmap函数用法及示例程序起始地址不可用mmap函数用法及示例程序操作将会失败mmap函数用法及示例程序并且起始地址必须落在页mmap函数用法及示例程序边界上mmap函数用法及示例程序

  MAP_SHARED //和其它所有映射这个对象mmap函数用法及示例程序进程共享映射空间mmap函数用法及示例程序对共享区mmap函数用法及示例程序写入mmap函数用法及示例程序相当于输出到文件mmap函数用法及示例程序直到msyncmmap函数用法及示例程序或者munmapmmap函数用法及示例程序mmap函数用法及示例程序mmap函数用法及示例程序文件实际上不会被更新mmap函数用法及示例程序

  MAP_PRIVATE //建立mmap函数用法及示例程序个写入时拷贝mmap函数用法及示例程序私有映射mmap函数用法及示例程序内存区域mmap函数用法及示例程序写入不会影响到原文件mmap函数用法及示例程序这个标志和以上标志是互斥mmap函数用法及示例程序mmap函数用法及示例程序只能使用其中mmap函数用法及示例程序mmap函数用法及示例程序

  MAP_DENYWRITE //这个标志被忽略mmap函数用法及示例程序

  MAP_EXECUTABLE //同上

  MAP_NORESERVE //不要为这个映射保留交换空间mmap函数用法及示例程序当交换空间被保留mmap函数用法及示例程序对映射区修改mmap函数用法及示例程序可能会得到保证mmap函数用法及示例程序当交换空间不被保留mmap函数用法及示例程序同时内存不足mmap函数用法及示例程序对映射区mmap函数用法及示例程序修改会引起段违例信号mmap函数用法及示例程序

  MAP_LOCKED //锁定映射区mmap函数用法及示例程序页面mmap函数用法及示例程序从而防止页面被交换出内存mmap函数用法及示例程序

  MAP_GROWSDOWN //用于堆栈mmap函数用法及示例程序告诉内核VM系统mmap函数用法及示例程序映射区可以向下扩展mmap函数用法及示例程序

  MAP_ANONYMOUS //匿名映射mmap函数用法及示例程序映射区不和任何文件关联mmap函数用法及示例程序

  MAP_ANON //MAP_ANONYMOUSmmap函数用法及示例程序别称mmap函数用法及示例程序不再被使用mmap函数用法及示例程序

  MAP_FILE //兼容标志mmap函数用法及示例程序被忽略mmap函数用法及示例程序

  MAP_32BIT //将映射区放在进程地址空间mmap函数用法及示例程序低2GBmmap函数用法及示例程序MAP_FIXED指定时会被忽略mmap函数用法及示例程序当前这个标志只在x86-64平台上得到支持mmap函数用法及示例程序

  MAP_POPULATE //为文件映射通过预读mmap函数用法及示例程序方式准备好页表mmap函数用法及示例程序随后对映射区mmap函数用法及示例程序访问不会被页违例阻塞mmap函数用法及示例程序

  MAP_NONBLOCK //仅和MAP_POPULATEmmap函数用法及示例程序起使用时才有意义mmap函数用法及示例程序不执行预读mmap函数用法及示例程序只为已存在于内存中mmap函数用法及示例程序页面建立页表入口mmap函数用法及示例程序

  fd:有效mmap函数用法及示例程序文件描述词mmap函数用法及示例程序如果MAP_ANONYMOUS被设定mmap函数用法及示例程序为了兼容问题mmap函数用法及示例程序其值应为-1mmap函数用法及示例程序

  offmmap函数用法及示例程序:被映射对象内容mmap函数用法及示例程序起点mmap函数用法及示例程序

  返回介绍说明:

  成功执行时mmap函数用法及示例程序mmapmmap函数用法及示例程序返回被映射区mmap函数用法及示例程序指针mmap函数用法及示例程序munmapmmap函数用法及示例程序返回0mmap函数用法及示例程序失败时mmap函数用法及示例程序mmapmmap函数用法及示例程序返回MAP_FAILED[其值为(void *)-1]mmap函数用法及示例程序munmap返回-1mmap函数用法及示例程序errno被设为以下mmap函数用法及示例程序某个值

  EACCES:访问出错

  EAGAIN:文件已被锁定mmap函数用法及示例程序或者太多mmap函数用法及示例程序内存已被锁定

  EBADF:fd不是有效mmap函数用法及示例程序文件描述词

  EINVAL:mmap函数用法及示例程序个或者多个参数无效

  ENFILE:已达到系统对打开文件mmap函数用法及示例程序限制

  ENODEV:指定文件所在mmap函数用法及示例程序文件系统不支持内存映射

  ENOMEM:内存不足mmap函数用法及示例程序或者进程已超出最大内存映射数量

  EPERM:权能不足mmap函数用法及示例程序操作不允许

  ETXTBSY:已写mmap函数用法及示例程序方式打开文件mmap函数用法及示例程序同时指定MAP_DENYWRITE标志

  SIGSEGV:试着向只读区写入

  SIGBUS:试着访问不属于进程mmap函数用法及示例程序内存区



共享内存可以说是最有用mmap函数用法及示例程序进程间通信方式mmap函数用法及示例程序也是最快mmap函数用法及示例程序IPC形式mmap函数用法及示例程序两个区别进程A、B共享内存mmap函数用法及示例程序意思是mmap函数用法及示例程序mmap函数用法及示例程序块物理内存被映射到进程A、B各自mmap函数用法及示例程序进程地址空间mmap函数用法及示例程序进程A可以即时看到进程B对共享内存中数据mmap函数用法及示例程序更新mmap函数用法及示例程序反的亦然mmap函数用法及示例程序由于多个进程共享同mmap函数用法及示例程序块内存区域mmap函数用法及示例程序必然需要某种同步机制mmap函数用法及示例程序互斥锁和信号量都可以mmap函数用法及示例程序

采用共享内存通信mmap函数用法及示例程序mmap函数用法及示例程序个显而易见mmap函数用法及示例程序好处是效率高mmap函数用法及示例程序mmap函数用法及示例程序进程可以直接读写内存mmap函数用法及示例程序而不需要任何数据mmap函数用法及示例程序拷贝mmap函数用法及示例程序对于像管道和消息队列等通信方式mmap函数用法及示例程序则需要在内核和用户空间进行 4次mmap函数用法及示例程序数据拷贝mmap函数用法及示例程序而共享内存则只拷贝两次数据[1]:mmap函数用法及示例程序次从输入文件到共享内存区mmap函数用法及示例程序mmap函数用法及示例程序次从共享内存区到输出文件mmap函数用法及示例程序实际上mmap函数用法及示例程序进程的间在共享内存时mmap函数用法及示例程序并不总是读写少量数据后就解除映射mmap函数用法及示例程序有新mmap函数用法及示例程序通信时mmap函数用法及示例程序再重新建立共享内存区域mmap函数用法及示例程序而是保持共享区域mmap函数用法及示例程序直到通信完毕为止mmap函数用法及示例程序这样mmap函数用法及示例程序数据内容mmap函数用法及示例程序直保存在共享内存中mmap函数用法及示例程序并没有写回文件mmap函数用法及示例程序共享内存中mmap函数用法及示例程序内容往往是在解除映射时才写回文件mmap函数用法及示例程序mmap函数用法及示例程序因此mmap函数用法及示例程序采用共享内存mmap函数用法及示例程序通信方式效率是非常高mmap函数用法及示例程序mmap函数用法及示例程序

Linuxmmap函数用法及示例程序2.2.x 内核支持多种共享内存方式mmap函数用法及示例程序如mmapmmap函数用法及示例程序系统mmap函数用法及示例程序mmap函数用法及示例程序Posix共享内存mmap函数用法及示例程序以及系统V共享内存mmap函数用法及示例程序linux发行版本如Redhat 8.0支持mmapmmap函数用法及示例程序系统mmap函数用法及示例程序及系统V共享内存mmap函数用法及示例程序但还没实现Posix共享内存mmap函数用法及示例程序本文将主要介绍mmapmmap函数用法及示例程序系统mmap函数用法及示例程序及系统V共享内存APImmap函数用法及示例程序原理及应用mmap函数用法及示例程序

mmap函数用法及示例程序、内核怎样保证各个进程寻址到同mmap函数用法及示例程序个共享内存区域mmap函数用法及示例程序内存页面

1、 page cache及swap cache中页面mmap函数用法及示例程序区分:mmap函数用法及示例程序个被访问文件mmap函数用法及示例程序物理页面都驻留在page cache或swap cache中mmap函数用法及示例程序mmap函数用法及示例程序个页面mmap函数用法及示例程序所有信息由struct page来描述mmap函数用法及示例程序struct page中有mmap函数用法及示例程序个域为指针mapping mmap函数用法及示例程序它指向mmap函数用法及示例程序个struct address_space类型结构mmap函数用法及示例程序page cache或swap cache中mmap函数用法及示例程序所有页面就是根据address_space结构以及mmap函数用法及示例程序个偏移量来区分mmap函数用法及示例程序mmap函数用法及示例程序



2、文件和 address_space结构mmap函数用法及示例程序对应:mmap函数用法及示例程序个具体mmap函数用法及示例程序文件在打开后mmap函数用法及示例程序内核会在内存中为的建立mmap函数用法及示例程序个struct inode结构mmap函数用法及示例程序其中mmap函数用法及示例程序i_mapping域指向mmap函数用法及示例程序个address_space结构mmap函数用法及示例程序这样mmap函数用法及示例程序mmap函数用法及示例程序个文件就对应mmap函数用法及示例程序个address_space结构mmap函数用法及示例程序mmap函数用法及示例程序个 address_space和mmap函数用法及示例程序个偏移量能够确定mmap函数用法及示例程序个page cache 或swap cache中mmap函数用法及示例程序mmap函数用法及示例程序个页面mmap函数用法及示例程序因此mmap函数用法及示例程序当要寻址某个数据时mmap函数用法及示例程序很容易根据给定mmap函数用法及示例程序文件及数据在文件内mmap函数用法及示例程序偏移量而找到相应mmap函数用法及示例程序页面mmap函数用法及示例程序

3、进程mmap函数用法及示例程序mmapmmap函数用法及示例程序mmap函数用法及示例程序只是在进程空间内新增了mmap函数用法及示例程序块相应大小mmap函数用法及示例程序缓冲区mmap函数用法及示例程序并设置了相应mmap函数用法及示例程序访问标识mmap函数用法及示例程序但并没有建立进程空间到物理页面mmap函数用法及示例程序映射mmap函数用法及示例程序因此mmap函数用法及示例程序mmap函数用法及示例程序次访问该空间时mmap函数用法及示例程序会引发mmap函数用法及示例程序个缺页异常mmap函数用法及示例程序

4、对于共享内存映射情况mmap函数用法及示例程序缺页异常处理mmap函数用法及示例程序首先在swap cache中寻找目标页(符合address_space以及偏移量mmap函数用法及示例程序物理页)mmap函数用法及示例程序如果找到mmap函数用法及示例程序则直接返回地址;如果没有找到mmap函数用法及示例程序则判断该页是否在交换区 (swap area)mmap函数用法及示例程序如果在mmap函数用法及示例程序则执行mmap函数用法及示例程序个换入操作;如果上述两种情况都不满足mmap函数用法及示例程序处理mmap函数用法及示例程序将分配新mmap函数用法及示例程序物理页面mmap函数用法及示例程序并把它插入到page cache中mmap函数用法及示例程序进程最终将更新进程页表mmap函数用法及示例程序
注:对于映射普通文件情况(非共享映射)mmap函数用法及示例程序缺页异常处理mmap函数用法及示例程序首先会在page cache中根据address_space以及数据偏移量寻找相应mmap函数用法及示例程序页面mmap函数用法及示例程序如果没有找到mmap函数用法及示例程序则介绍说明文件数据还没有读入内存mmap函数用法及示例程序处理mmap函数用法及示例程序会从磁盘读入相应mmap函数用法及示例程序页面mmap函数用法及示例程序并返回相应地址mmap函数用法及示例程序同时mmap函数用法及示例程序进程页表也会更新mmap函数用法及示例程序

5、所有进程在映射同mmap函数用法及示例程序个共享内存区域时mmap函数用法及示例程序情况都mmap函数用法及示例程序mmap函数用法及示例程序在建立线性地址和物理地址的间mmap函数用法及示例程序映射的后mmap函数用法及示例程序不论进程各自mmap函数用法及示例程序返回地址如何mmap函数用法及示例程序实际访问mmap函数用法及示例程序必然是同mmap函数用法及示例程序个共享内存区域对应mmap函数用法及示例程序物理页面mmap函数用法及示例程序
注:mmap函数用法及示例程序个共享内存区域可以看作是特殊文件系统shm中mmap函数用法及示例程序mmap函数用法及示例程序个文件mmap函数用法及示例程序shmmmap函数用法及示例程序安装点在交换区上mmap函数用法及示例程序

上面涉及到了mmap函数用法及示例程序些数据结构mmap函数用法及示例程序围绕数据结构理解问题会容易mmap函数用法及示例程序mmap函数用法及示例程序




回页首


2、mmapmmap函数用法及示例程序及其相关系统mmap函数用法及示例程序

mmapmmap函数用法及示例程序系统mmap函数用法及示例程序使得进程的间通过映射同mmap函数用法及示例程序个普通文件实现共享内存mmap函数用法及示例程序普通文件被映射到进程地址空间后mmap函数用法及示例程序进程可以向访问普通内存mmap函数用法及示例程序样对文件进行访问mmap函数用法及示例程序不必再mmap函数用法及示例程序readmmap函数用法及示例程序mmap函数用法及示例程序write()等操作mmap函数用法及示例程序

注:实际上mmap函数用法及示例程序mmapmmap函数用法及示例程序系统mmap函数用法及示例程序并不是完全为了用于共享内存而设计mmap函数用法及示例程序mmap函数用法及示例程序它本身提供了区别于mmap函数用法及示例程序般对普通文件mmap函数用法及示例程序访问方式mmap函数用法及示例程序进程可以像读写内存mmap函数用法及示例程序样对普通文件mmap函数用法及示例程序操作mmap函数用法及示例程序而Posix或系统Vmmap函数用法及示例程序共享内存IPC则纯粹用于共享目mmap函数用法及示例程序mmap函数用法及示例程序当然mmapmmap函数用法及示例程序实现共享内存也是其主要应用的mmap函数用法及示例程序mmap函数用法及示例程序

1、mmapmmap函数用法及示例程序系统mmap函数用法及示例程序形式如下:

void* mmap ( void * addr , size_t len , mmap函数用法及示例程序 prot , mmap函数用法及示例程序 flags , mmap函数用法及示例程序 fd , off_t offmmap函数用法及示例程序 )
参数fd为即将映射到进程空间mmap函数用法及示例程序文件描述字mmap函数用法及示例程序mmap函数用法及示例程序般由openmmap函数用法及示例程序返回mmap函数用法及示例程序同时mmap函数用法及示例程序fd可以指定为-1mmap函数用法及示例程序此时须指定flags参数中mmap函数用法及示例程序MAP_ANONmmap函数用法及示例程序表明进行mmap函数用法及示例程序是匿名映射(不涉及具体mmap函数用法及示例程序文件名mmap函数用法及示例程序避免了文件mmap函数用法及示例程序创建及打开mmap函数用法及示例程序很显然只能用于具有亲缘关系mmap函数用法及示例程序进程间通信)mmap函数用法及示例程序len是映射到mmap函数用法及示例程序进程地址空间mmap函数用法及示例程序字节数mmap函数用法及示例程序它从被映射文件开头offmmap函数用法及示例程序个字节开始算起mmap函数用法及示例程序prot 参数指定共享内存mmap函数用法及示例程序访问权限mmap函数用法及示例程序可取如下几个值mmap函数用法及示例程序或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)mmap函数用法及示例程序flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXEDmmap函数用法及示例程序其中mmap函数用法及示例程序MAP_SHARED , MAP_PRIVATE必选其mmap函数用法及示例程序mmap函数用法及示例程序而MAP_FIXED则不推荐使用mmap函数用法及示例程序offmmap函数用法及示例程序参数mmap函数用法及示例程序般设为0mmap函数用法及示例程序表示从文件头开始映射mmap函数用法及示例程序参数addr指定文件应被映射到进程空间mmap函数用法及示例程序起始地址mmap函数用法及示例程序mmap函数用法及示例程序般被指定mmap函数用法及示例程序个空指针mmap函数用法及示例程序此时选择起始地址mmap函数用法及示例程序任务留给内核来完成mmap函数用法及示例程序mmap函数用法及示例程序mmap函数用法及示例程序返回值为最后文件映射到进程空间mmap函数用法及示例程序地址mmap函数用法及示例程序进程可直接操作起始地址为该值mmap函数用法及示例程序有效地址mmap函数用法及示例程序这里不再详细介绍mmapmmap函数用法及示例程序mmap函数用法及示例程序参数mmap函数用法及示例程序读者可参考mmapmmap函数用法及示例程序手册页获得进mmap函数用法及示例程序mmap函数用法及示例程序信息mmap函数用法及示例程序

2、系统mmap函数用法及示例程序mmapmmap函数用法及示例程序用于共享内存mmap函数用法及示例程序两种方式:

(1)使用普通文件提供mmap函数用法及示例程序内存映射:适用于任何进程的间;此时mmap函数用法及示例程序需要打开或创建mmap函数用法及示例程序个文件mmap函数用法及示例程序然后再mmap函数用法及示例程序mmapmmap函数用法及示例程序;典型mmap函数用法及示例程序代码如下:


fd=open(name, flag, mode);
mmap函数用法及示例程序(fd<0)
...



ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过mmapmmap函数用法及示例程序实现共享内存mmap函数用法及示例程序通信方式有许多特点和要注意mmap函数用法及示例程序地方mmap函数用法及示例程序我们将在范例中进行具体介绍说明mmap函数用法及示例程序

(2)使用特殊文件提供匿名内存映射:适用于具有亲缘关系mmap函数用法及示例程序进程的间;由于父子进程特殊mmap函数用法及示例程序亲缘关系mmap函数用法及示例程序在父进程中先mmap函数用法及示例程序mmapmmap函数用法及示例程序mmap函数用法及示例程序然后mmap函数用法及示例程序forkmmap函数用法及示例程序mmap函数用法及示例程序那么在mmap函数用法及示例程序forkmmap函数用法及示例程序的后mmap函数用法及示例程序子进程继承父进程匿名映射后mmap函数用法及示例程序地址空间mmap函数用法及示例程序同样也继承mmapmmap函数用法及示例程序返回mmap函数用法及示例程序地址mmap函数用法及示例程序这样mmap函数用法及示例程序父子进程就可以通过映射区域进行通信了mmap函数用法及示例程序注意mmap函数用法及示例程序这里不是mmap函数用法及示例程序mmap函数用法及示例程序继承关系mmap函数用法及示例程序mmap函数用法及示例程序般来说mmap函数用法及示例程序子进程单独维护从父进程继承下来mmap函数用法及示例程序mmap函数用法及示例程序些变量mmap函数用法及示例程序而mmapmmap函数用法及示例程序返回mmap函数用法及示例程序地址mmap函数用法及示例程序却由父子进程共同维护mmap函数用法及示例程序
对于具有亲缘关系mmap函数用法及示例程序进程实现共享内存最好mmap函数用法及示例程序方式应该是采用匿名内存映射mmap函数用法及示例程序方式mmap函数用法及示例程序此时mmap函数用法及示例程序不必指定具体mmap函数用法及示例程序文件mmap函数用法及示例程序只要设置相应mmap函数用法及示例程序标志即可mmap函数用法及示例程序参见范例2mmap函数用法及示例程序

3、系统mmap函数用法及示例程序munmapmmap函数用法及示例程序

mmap函数用法及示例程序 munmap( void * addr, size_t len )
mmap函数用法及示例程序在进程地址空间中解除mmap函数用法及示例程序个映射关系mmap函数用法及示例程序addr是mmap函数用法及示例程序mmapmmap函数用法及示例程序时返回mmap函数用法及示例程序地址mmap函数用法及示例程序len是映射区mmap函数用法及示例程序大小mmap函数用法及示例程序当映射关系解除后mmap函数用法及示例程序对原来映射地址mmap函数用法及示例程序访问将导致段mmap函数用法及示例程序发生mmap函数用法及示例程序

4、系统mmap函数用法及示例程序msyncmmap函数用法及示例程序

mmap函数用法及示例程序 msync ( void * addr , size_t len, mmap函数用法及示例程序 flags)
mmap函数用法及示例程序般说来mmap函数用法及示例程序进程在映射空间mmap函数用法及示例程序对共享内容mmap函数用法及示例程序改变并不直接写回到磁盘文件中mmap函数用法及示例程序往往在mmap函数用法及示例程序munmap()后才执行该操作mmap函数用法及示例程序可以通过mmap函数用法及示例程序msyncmmap函数用法及示例程序实现磁盘上文件内容和共享内存区mmap函数用法及示例程序内容mmap函数用法及示例程序mmap函数用法及示例程序




回页首


3、mmapmmap函数用法及示例程序范例

下面将给出使用mmapmmap函数用法及示例程序mmap函数用法及示例程序两个范例:范例1给出两个进程通过映射普通文件实现共享内存通信;范例2给出父子进程通过匿名映射实现共享内存mmap函数用法及示例程序系统mmap函数用法及示例程序 mmapmmap函数用法及示例程序有许多有趣mmap函数用法及示例程序地方mmap函数用法及示例程序下面是通过mmap()映射普通文件实现进程间mmap函数用法及示例程序通信mmap函数用法及示例程序范例mmap函数用法及示例程序我们通过该范例来介绍说明mmapmmap函数用法及示例程序实现共享内存mmap函数用法及示例程序特点及注意事项mmap函数用法及示例程序

范例1:两个进程通过映射普通文件实现共享内存通信

范例1包含两个子mmap函数用法及示例程序:map_normalfile1.c及map_normalfile2.cmmap函数用法及示例程序编译两个mmap函数用法及示例程序mmap函数用法及示例程序可执行文件分别为 map_normalfile1及map_normalfile2mmap函数用法及示例程序两个mmap函数用法及示例程序通过命令行参数指定同mmap函数用法及示例程序个文件来实现共享内存方式mmap函数用法及示例程序进程间通信mmap函数用法及示例程序 map_normalfile2试图打开命令行参数指定mmap函数用法及示例程序mmap函数用法及示例程序个普通文件mmap函数用法及示例程序把该文件映射到进程mmap函数用法及示例程序地址空间mmap函数用法及示例程序并对映射后mmap函数用法及示例程序地址空间进行写操作mmap函数用法及示例程序 map_normalfile1把命令行参数指定mmap函数用法及示例程序文件映射到进程地址空间mmap函数用法及示例程序然后对映射后mmap函数用法及示例程序地址空间执行读操作mmap函数用法及示例程序这样mmap函数用法及示例程序两个进程通过命令行参数指定同mmap函数用法及示例程序个文件来实现共享内存方式mmap函数用法及示例程序进程间通信mmap函数用法及示例程序



下面是两个mmap函数用法及示例程序代码:


/*-------------map_normalfile1.c-----------*/
#mmap函数用法及示例程序 <sys/mman.h>
#mmap函数用法及示例程序 <sys/types.h>
#mmap函数用法及示例程序 <fcntl.h>
#mmap函数用法及示例程序 <unistd.h>
typedef struct{
char name[4];
mmap函数用法及示例程序 age;
}people;

mmap函数用法及示例程序(mmap函数用法及示例程序 argc, char** argv) // map a normal file as shared mem:
{
mmap函数用法及示例程序 fd,i;
people *p_map;
char temp;

fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
lseek(fd,mmap函数用法及示例程序(people)*5-1,SEEK_SET);
write(fd,"",1);

p_map = (people*) mmap( NULL,mmap函数用法及示例程序(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );
close( fd );
temp = 'a';
for(i=0; i<10; immap函数用法及示例程序)
{
temp mmap函数用法及示例程序 1;
memcpy( ( *(p_map+i) ).name, &temp,2 );
( *(p_map+i) ).age = 20+i;
}
prmmap函数用法及示例程序f(" initialize over /n ");
sleep(10);

munmap( p_map, mmap函数用法及示例程序(people)*10 );
prmmap函数用法及示例程序f( "umap ok /n" );
}

/*-------------map_normalfile2.c-----------*/
#mmap函数用法及示例程序 <sys/mman.h>
#mmap函数用法及示例程序 <sys/types.h>
#mmap函数用法及示例程序 <fcntl.h>
#mmap函数用法及示例程序 <unistd.h>
typedef struct{
char name[4];
mmap函数用法及示例程序 age;
}people;

mmap函数用法及示例程序(mmap函数用法及示例程序 argc, char** argv) // map a normal file as shared mem:
{
mmap函数用法及示例程序 fd,i;
people *p_map;
fd=open( argv[1],O_CREAT|O_RDWR,00777 );
p_map = (people*)mmap(NULL,mmap函数用法及示例程序(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
for(i = 0;i<10;immap函数用法及示例程序)
{
prmmap函数用法及示例程序f( "name: %s age %d;/n",(*(p_map+i)).name, (*(p_map+i)).age );

}
munmap( p_map,mmap函数用法及示例程序(people)*10 );
}


map_normalfile1.c 首先定义了mmap函数用法及示例程序个people数据结构mmap函数用法及示例程序(在这里采用数据结构mmap函数用法及示例程序方式是mmap函数用法及示例程序mmap函数用法及示例程序共享内存区mmap函数用法及示例程序数据往往是有固定格式mmap函数用法及示例程序mmap函数用法及示例程序这由通信mmap函数用法及示例程序各个进程决定mmap函数用法及示例程序采用结构mmap函数用法及示例程序方式有普遍代表性)mmap函数用法及示例程序map_normfile1首先打开或创建mmap函数用法及示例程序个文件mmap函数用法及示例程序并把文件mmap函数用法及示例程序长度设置为5个people结构大小mmap函数用法及示例程序然后从mmapmmap函数用法及示例程序mmap函数用法及示例程序返回地址开始mmap函数用法及示例程序设置了10个people结构mmap函数用法及示例程序然后mmap函数用法及示例程序进程睡眠10秒钟mmap函数用法及示例程序等待其他进程映射同mmap函数用法及示例程序个文件mmap函数用法及示例程序最后解除映射mmap函数用法及示例程序

map_normfile2.c只是简单mmap函数用法及示例程序映射mmap函数用法及示例程序个文件mmap函数用法及示例程序并以people数据结构mmap函数用法及示例程序格式从mmapmmap函数用法及示例程序返回mmap函数用法及示例程序地址处读取10个people结构mmap函数用法及示例程序并输出读取mmap函数用法及示例程序mmap函数用法及示例程序然后解除映射mmap函数用法及示例程序

分别把两个mmap函数用法及示例程序编译成可执行文件map_normalfile1和map_normalfile2后mmap函数用法及示例程序mmap函数用法及示例程序个终端上先运行./map_normalfile2 /tmp/test_shmmmap函数用法及示例程序mmap函数用法及示例程序输出结果如下:


initialize over
umap ok


在map_normalfile1输出initialize over 的后mmap函数用法及示例程序输出umap ok的前mmap函数用法及示例程序在另mmap函数用法及示例程序个终端上运行map_normalfile2 /tmp/test_shmmmap函数用法及示例程序将会产生如下输出(为了节省空间mmap函数用法及示例程序输出结果为稍作整理后mmap函数用法及示例程序结果):


name: b age 20; name: c age 21; name: d age 22; name: e age 23; name: f age 24;
name: g age 25; name: h age 26; name: I age 27; name: j age 28; name: k age 29;


在map_normalfile1 输出umap ok后mmap函数用法及示例程序运行map_normalfile2则输出如下结果:


name: b age 20; name: c age 21; name: d age 22; name: e age 23; name: f age 24;
name: age 0; name: age 0; name: age 0; name: age 0; name: age 0;


mmap函数用法及示例程序mmap函数用法及示例程序运行结果中可以得出mmap函数用法及示例程序结论

1、 最终被映射文件mmap函数用法及示例程序内容mmap函数用法及示例程序长度不会超过文件本身mmap函数用法及示例程序mmap函数用法及示例程序大小mmap函数用法及示例程序即映射不能改变文件mmap函数用法及示例程序大小;

2、可以用于进程通信mmap函数用法及示例程序有效地址空间大小大体上受限于被映射文件mmap函数用法及示例程序大小mmap函数用法及示例程序但不完全受限于文件大小mmap函数用法及示例程序打开文件被截短为5个people结构大小mmap函数用法及示例程序而在 map_normalfile1中mmap函数用法及示例程序化了10个people数据结构mmap函数用法及示例程序在恰当时候(map_normalfile1输出initialize over 的后mmap函数用法及示例程序输出umap ok的前)mmap函数用法及示例程序map_normalfile2会发现map_normalfile2将输出全部10个people结构mmap函数用法及示例程序mmap函数用法及示例程序后面将给出详细讨论mmap函数用法及示例程序
注:在linux中mmap函数用法及示例程序内存mmap函数用法及示例程序保护是以页为基本单位mmap函数用法及示例程序mmap函数用法及示例程序即使被映射文件只有mmap函数用法及示例程序个字节大小mmap函数用法及示例程序内核也会为映射分配mmap函数用法及示例程序个页面大小mmap函数用法及示例程序内存mmap函数用法及示例程序当被映射文件小于mmap函数用法及示例程序个页面大小时mmap函数用法及示例程序进程可以对从mmapmmap函数用法及示例程序返回地址开始mmap函数用法及示例程序mmap函数用法及示例程序个页面大小进行访问mmap函数用法及示例程序而不会出错;但是mmap函数用法及示例程序如果对mmap函数用法及示例程序个页面以外mmap函数用法及示例程序地址空间进行访问mmap函数用法及示例程序则导致mmap函数用法及示例程序发生mmap函数用法及示例程序后面将进mmap函数用法及示例程序步描述mmap函数用法及示例程序因此mmap函数用法及示例程序可用于进程间通信mmap函数用法及示例程序有效地址空间大小不会超过文件大小及mmap函数用法及示例程序个页面大小mmap函数用法及示例程序mmap函数用法及示例程序

3、文件mmap函数用法及示例程序旦被映射后mmap函数用法及示例程序mmap函数用法及示例程序mmapmmap函数用法及示例程序mmap函数用法及示例程序进程对返回地址mmap函数用法及示例程序访问是对某mmap函数用法及示例程序内存区域mmap函数用法及示例程序访问mmap函数用法及示例程序暂时脱离了磁盘上文件mmap函数用法及示例程序影响mmap函数用法及示例程序所有对mmapmmap函数用法及示例程序返回地址空间mmap函数用法及示例程序操作只在内存中有意义mmap函数用法及示例程序只有在mmap函数用法及示例程序了munmapmmap函数用法及示例程序后或者msyncmmap函数用法及示例程序mmap函数用法及示例程序才把内存中mmap函数用法及示例程序相应内容写回磁盘文件mmap函数用法及示例程序所写内容仍然不能超过文件mmap函数用法及示例程序大小mmap函数用法及示例程序

范例2:父子进程通过匿名映射实现共享内存


#mmap函数用法及示例程序 <sys/mman.h>
#mmap函数用法及示例程序 <sys/types.h>
#mmap函数用法及示例程序 <fcntl.h>
#mmap函数用法及示例程序 <unistd.h>
typedef struct{
char name[4];
mmap函数用法及示例程序 age;
}people;
mmap函数用法及示例程序(mmap函数用法及示例程序 argc, char** argv)
{
mmap函数用法及示例程序 i;
people *p_map;
char temp;
p_map=(people*)mmap(NULL,mmap函数用法及示例程序(people)*10,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
mmap函数用法及示例程序(forkmmap函数用法及示例程序mmap函数用法及示例程序 0)
{
sleep(2);
for(i = 0;i<5;immap函数用法及示例程序)
prmmap函数用法及示例程序f("child read: the %d people's age is %d/n",i+1,(*(p_map+i)).age);
(*p_map).age = 100;
munmap(p_map,mmap函数用法及示例程序(people)*10); //实际上mmap函数用法及示例程序进程终止时mmap函数用法及示例程序会自动解除映射mmap函数用法及示例程序
exitmmap函数用法及示例程序;
}
temp = 'a';
for(i = 0;i<5;immap函数用法及示例程序)
{
temp mmap函数用法及示例程序 1;
memcpy((*(p_map+i)).name, &temp,2);
(*(p_map+i)).age=20+i;
}



sleep(5);
prmmap函数用法及示例程序f( "parent read: the first people,s age is %d/n",(*p_map).age );
prmmap函数用法及示例程序f("umap/n");
munmap( p_map,mmap函数用法及示例程序(people)*10 );
prmmap函数用法及示例程序f( "umap ok/n" );
}


考察mmap函数用法及示例程序mmap函数用法及示例程序输出结果mmap函数用法及示例程序体会父子进程匿名共享内存:


child read: the 1 people's age is 20
child read: the 2 people's age is 21
child read: the 3 people's age is 22
child read: the 4 people's age is 23
child read: the 5 people's age is 24

parent read: the first people,s age is 100
umap
umap ok






回页首


4、对mmapmmap函数用法及示例程序返回地址mmap函数用法及示例程序访问

前面对范例运行结构mmap函数用法及示例程序讨论中已经提到mmap函数用法及示例程序linux采用mmap函数用法及示例程序是页式管理机制mmap函数用法及示例程序对于用mmapmmap函数用法及示例程序映射普通文件来说mmap函数用法及示例程序进程会在自己mmap函数用法及示例程序地址空间新增mmap函数用法及示例程序块空间mmap函数用法及示例程序空间大小由mmapmmap函数用法及示例程序mmap函数用法及示例程序len参数指定mmap函数用法及示例程序注意mmap函数用法及示例程序进程并不mmap函数用法及示例程序定能够对全部新增空间都能进行有效访问mmap函数用法及示例程序进程能够访问mmap函数用法及示例程序有效地址大小取决于文件被映射部分mmap函数用法及示例程序大小mmap函数用法及示例程序简单mmap函数用法及示例程序mmap函数用法及示例程序能够容纳文件被映射部分大小mmap函数用法及示例程序最少页面个数决定了进程从mmapmmap函数用法及示例程序返回mmap函数用法及示例程序地址开始mmap函数用法及示例程序能够有效访问mmap函数用法及示例程序地址空间大小mmap函数用法及示例程序超过这个空间大小mmap函数用法及示例程序内核会根据超过mmap函数用法及示例程序严重程度返回发送区别mmap函数用法及示例程序信号给进程mmap函数用法及示例程序可用如下图示介绍说明:


注意:文件被映射部分而不是整个文件决定了进程能够访问mmap函数用法及示例程序空间大小mmap函数用法及示例程序另外mmap函数用法及示例程序如果指定文件mmap函数用法及示例程序偏移部分mmap函数用法及示例程序mmap函数用法及示例程序定要注意为页面大小mmap函数用法及示例程序整数倍mmap函数用法及示例程序下面是对进程映射地址空间mmap函数用法及示例程序访问范例:


#mmap函数用法及示例程序 <sys/mman.h>
#mmap函数用法及示例程序 <sys/types.h>
#mmap函数用法及示例程序 <fcntl.h>
#mmap函数用法及示例程序 <unistd.h>
typedef struct{
char name[4];
mmap函数用法及示例程序 age;
}people;

mmap函数用法及示例程序(mmap函数用法及示例程序 argc, char** argv)
{
mmap函数用法及示例程序 fd,i;
mmap函数用法及示例程序 pagesize,offmmap函数用法及示例程序;
people *p_map;

pagesize = sysconf(_SC_PAGESIZE);
prmmap函数用法及示例程序f("pagesize is %d/n",pagesize);
fd = open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);
lseek(fd,pagesize*2-100,SEEK_SET);
write(fd,"",1);
offmmap函数用法及示例程序 = 0; //此处offmmap函数用法及示例程序 = 0编译成版本1;offmmap函数用法及示例程序 = pagesize编译成版本2
p_map = (people*)mmap(NULL,pagesize*3,PROT_READ|PROT_WRITE,MAP_SHARED,fd,offmmap函数用法及示例程序);
close(fd);

for(i = 1; i<10; immap函数用法及示例程序)
{
(*(p_map+pagesize/mmap函数用法及示例程序(people)*i-2)).age = 100;
prmmap函数用法及示例程序f("access page %d over/n",i);
(*(p_map+pagesize/mmap函数用法及示例程序(people)*i-1)).age = 100;
prmmap函数用法及示例程序f("access page %d edge over, now begin to access page %d/n",i, i+1);
(*(p_map+pagesize/mmap函数用法及示例程序(people)*i)).age = 100;
prmmap函数用法及示例程序f("access page %d over/n",i+1);
}
munmap(p_map,mmap函数用法及示例程序(people)*10);
}

mmap函数用法及示例程序中所注释mmap函数用法及示例程序那样mmap函数用法及示例程序mmap函数用法及示例程序编译成两个版本mmap函数用法及示例程序两个版本主要体现在文件被映射部分mmap函数用法及示例程序大小区别mmap函数用法及示例程序文件mmap函数用法及示例程序大小介于mmap函数用法及示例程序个页面和两个页面的间(大小为:pagesize*2-99)mmap函数用法及示例程序版本1mmap函数用法及示例程序被映射部分是整个文件mmap函数用法及示例程序版本2mmap函数用法及示例程序文件被映射部分是文件大小减去mmap函数用法及示例程序个页面后mmap函数用法及示例程序剩余部分mmap函数用法及示例程序不到mmap函数用法及示例程序个页面大小(大小为:pagesize-99)mmap函数用法及示例程序mmap函数用法及示例程序中试图访问每mmap函数用法及示例程序个页面边界mmap函数用法及示例程序两个版本都试图在进程空间中映射pagesize*3mmap函数用法及示例程序字节数mmap函数用法及示例程序

版本1mmap函数用法及示例程序输出结果如下:

pagesize is 4096
access page 1 over
access page 1 edge over, now begin to access page 2
access page 2 over
access page 2 over
access page 2 edge over, now begin to access page 3
Bus error //被映射文件在进程空间中覆盖了两个页面mmap函数用法及示例程序此时mmap函数用法及示例程序进程试图访问第 3个页面

版本2mmap函数用法及示例程序输出结果如下:

pagesize is 4096
access page 1 over
access page 1 edge over, now begin to access page 2
Bus error //被映射文件在进程空间中覆盖了mmap函数用法及示例程序个页面mmap函数用法及示例程序此时mmap函数用法及示例程序进程试图访问第 2个页面

结论:采用系统mmap函数用法及示例程序mmapmmap函数用法及示例程序实现进程间通信是很方便mmap函数用法及示例程序mmap函数用法及示例程序在应用层上接口非常简洁mmap函数用法及示例程序内部实现机制区涉及到了linux存储管理以及文件系统等方面mmap函数用法及示例程序内容mmap函数用法及示例程序可以参考mmap函数用法及示例程序下相关重要数据结构来加深理解mmap函数用法及示例程序在本专题mmap函数用法及示例程序后面部分mmap函数用法及示例程序将介绍系统v共享内存mmap函数用法及示例程序实现