进程间通信的只要方式有,管道,有名管道,消息队列,共享内存,socket等方式,共享内存是最高效的

进程间通信的方式,因为把同一块物理内存的地址空间映射到不同进程的地址空间当中,那么不同的进程之间

通信,通过直接修改地址空间当中的内存即可,该机制的实现只需要两次拷贝即可实现,不需要像其它的进程

通信机制那样将数据从用户空间拷贝到内核,然后在从内核拷贝到用户空间,实行四次拷贝操作,因此使用共

享内存通信比较高效。

  使用共享内存的话,需要对共享的进程对共享内存的访问进行同步,防止访问对于共享数据的破坏。

  共享内存的实现方式:

         一 基于物理内存实现的shm_get()实现的共享内存

  1 shm_get()

    使用该系统调用来申请一块共享内存,使用了该系统调用之后会返回一个共享内存的键值,进程可以

使用该key值来使用这块共享内存。shm_get()操作会返回一个和key值关联的shmid,其它的进程可以通过该

shmid将该贡献内存添加到进程的地址空间里面。

  2 shmat(id,addr,flag)

  使用该系统调用将使用shm_get()获得的共享内存挂载到当前进程的地址空间,addr参数可以选择连接的

地址位置,通常设置为0,让操作系统选择合适的连接位置,flag也是设置为默认值0。

  3 shm_dt()

  可以删除指定的共享内存,从当前的进程的地址空间当中删除。通过shmat()返回的挂载的地址,将加到进程

地址空间当中的内存删除。

  4 shm_ctl()

  对指定的共向内存空间进行操作。也是通过shm_get()返回的标识符来进行相关的操作。

  二 基于文件映射实现的mmap实现的共享内存

  进程通过将一个普通文件的内映射到每个进程的地址空间当中,对映射区的修改会被写回到文件当中,其他

进程可以共享这些修改。将文件映射到了进程的地址空间之后,可以直接对该段虚拟地址空间进行读写操作,不需

使用read,write等系统调用来进行读写。

  mmap实现的共享内存,每个文件有自己的内存映射区,在munmap调用之后,会将修改的内容写回文件当中。