进程间通信之: 共享内存
8.5共享内存
8.5.1共享内存概述
可以说,共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。为了在多个进程间交换信息,内核专门留出了一块内存区。这段内存区可以由需要访问的进程将其映射到自己的私有地址空间。因此,进程就可以直接读写这一内存区而不需要进行数据的复制,从而大大提高了效率。当然,由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等(请参考本章的共享内存实验)。其原理示意图如图8.8所示。
图8.8共享内存原理示意图
8.5.2共享内存的应用
1.函数说明
共享内存的实现分为两个步骤,第一步是创建共享内存,这里用到的函数是shmget(),也就是从内存中获得一段共享内存区域,第二步映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中,这里使用的函数是shmat()。到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作。除此之外,当然还有撤销映射的操作,其函数为shmdt()。这里就主要介绍这3个函数。
2.函数格式
表8.20列举了shmget()函数的语法要点。
表8.20 shmget()函数语法要点
所需头文件 | #includesys/types.h> |
函数原型 | intshmget(key_tkey,intsize,intshmflg) |
函数传入值 | key:共享内存的键值,多个进程可以通过它访问同一个共享内存,其中有个特殊值IPC_PRIVATE。它用于创建当前进程的私有共享内存 |
size:共享内存区大小 | |
shmflg:同open()函数的权限位,也可以用八进制表示法 | |
函数返回值 | 成功:共享内存段标识符 |
出错:-1 |
表8.21列举了shmat()函数的语法要点。
表8.21 shmat()函数语法要点
所需头文件 | #includesys/types.h> | |
函数原型 | char*shmat(intshmid,constvoid*shmaddr,intshmflg) | |
函数传入值 | shmid:要映射的共享内存区标识符 | |
shmaddr:将共享内存映射到指定地址(若为0则表示系统自动分配地址并把该段共享内存映射到调用进程的地址空间) | ||
shmflg | SHM_RDONLY:共享内存只读 | |
默认0:共享内存可读写 | ||
函数返回值 | 成功:被映射的段地址 | |
出错:-1 |
表8.22列举了shmdt()函数的语法要点。
表8.22 shmdt()函数语法要点
所需头文件 | #includesys/types.h> |
函数原型 | intshmdt(constvoid*shmaddr) |
函数传入值 | shmaddr:被映射的共享内存段地址 |
函数返回值 | 成功:0 |
出错:-1 |
评论