日期:2014-05-16  浏览次数:20721 次

Linux 进程间通讯之共享内存方式

共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。

共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。

 

共享内存实现步骤:

一、创建共享内存,使用shmget函数。

二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

 

创建共享内存shmget

intshmget(key_t key, size_t size, int shmflg)

功能:得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。

key: 0(IPC_PRIVATE)会建立共享内存对象

size:大于0的整数,新建共享内存的大小,以字节为单位。只获取共享内存时,指定为0.

shmflg:

         0表示取共享内存标识符,如不存在则函数会报错;

         IPC_CREAT如果内核中不存在键值与key相等的共享内存时,则创建一个共享内存;如果存在这样的共享内存则返回共享内存的标识符;

         IPC_CREAT|IPC_EXCL: 如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错;

函数返回值:成功则返回内存的标识符;出错则返回-1,错误原因存在于error

 

映射共享内存到调用进程的地址空间shmat

void*shmat(int shmid, const void *shmaddr, int shmflg)

msqid:共享内存标识符

shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。

shmflg: SHM_RDONLY