映射普通文件实现共享内存通信,可以得出如 下结论: 1、 系统 V 共享内存中的数据,从来不写入到实际磁盘文件中去;而通过 mmap()映射普通 文件实现的共享内存通信可以指定何时将数据写入磁盘文件中。 注:前面讲到,系统 V 共 享内存机制实际是通过映射特殊文件系统 shm 中的文件实现的, 文件系统 shm 的安装点在 交换分区上,系统重新引导后,所有的内容都丢失。 2、 系统 V 共享内存是随内核持续的,即使所有访问共享内存的进程都已经正常终止,共 享内存区仍然存在(除非显式删除共享内存),在内核重新引导之前,对该共享内存区域的 任何改写操作都将一直保留。 3、 通过调用 mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时终止对通 信的影响。而通过系统 V 共享内存实现通信的进程则不然。 注:这里没有给出 shmctl 的 使用范例,原理与消息队列大同小异。 回页首 结论: 共享内存允许两个或多个进程共享一给定的存储区, 因为数据不需要来回复制, 所以是最快 的一种进程间通信机制。共享内存可以通过 mmap()映射普通文件(特殊情况下还可以采用 匿名映射)机制实现,也可以通过系统 V 共享内存机制实现。应用接口和原理很简单,内 部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。 共享内存涉及到了存储管理以及文件系统等方面的知识, 深入理解其内部机制有一定的难度, 关键还要紧紧抓住内核使用的重要数据结构。