Linux 进程间通信 - 共享内存 shmget 方式(转)共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。图 共享内存映射图象所有的 SystemVIPC对象一样,对于共享内存对象的获取是由 key控制。内存共享之后,对进程如何使用这块内存就不再做检查。它们必须依赖于其它机制,比如 SystemV的信号灯来同步对于共享内存区域的访问(信号灯如何控制对临界代码的访问另起一篇说话)。每一个新创建的共享内存对象都用一个 shmid_kernel数据结构来表达。系统中所有的shmid_kernel数据结构都保存在 shm_segs向量表中,该向量表的每一个元素都是一个指向shmid_kernel数据结构的指针。shm_segs向量表的定义如下:structshmid_kernel*shm_segs[SHMMNI];SHMMNI为128,表示系统中最多可以有128个共享内存对象。数据结构 shmid_kernel的定义如下:structshmid_kernel{structshmid_dsu;/*the followingareprivate*/unsignedlongshm_npages;/*sizeofsegment(pages)*/unsignedlong*shm_pages;/*arrayofptrstoframes-> SHMMAX*/structvm_area_struct*attaches;/*descriptorsforattaches*/};其中:shm_pages代表该共享内存对象的所占据的内存页面数组,数组里面的每个元素当然是每个内存页面的起始地址.shm_npages则是该共享内存对象占用内存页面的个数,以页为单位。这个数量当然涵盖了申请空间的最小整数倍.(Anewsharedmemorysegment,withsizeequaltothevalueofsizeroundeduptoamultipleofPAGE_SIZE)shmid_ds是一个数据结构,它描述了这个共享内存区的认证信息,字节大小,最后一次粘附时间、分离时间、改变时间,创建该共享区域的进程,最后一次对它操作的进程,当前有多少个进程在使用它等信息。其定义如下:structshmid_ds{structipc_permshm_perm;/*operationperms*/intshm_segsz;/*sizeofsegment(bytes)*/__kernel_time_tshm_atime;/*lastattachtime*/__kernel_time_tshm_dtime;/*lastdetachtime*/__kernel_time_tshm_ctime;/*lastchangetime*/__kernel_ipc_pid_tsh...