我想在进程之间共享内存,这些进程独立运行,而不是fork
。
我已经阅读了mmap
和shm_open
的手册页,但仍然对用法感到困惑。
mmap
有fd
参数呢?这是否意味着内存实际上是通过文件共享的? shm_open
似乎接受文件名作为参数,因此实际上会打开文件吗?有人可以给出一些示例代码来在两个进程之间共享内存吗?假设我们有一个流程producer
和一个consumer
流程,它们将如何通过通过mmap
共享的内存段进行通信?
答案 0 :(得分:0)
从本质上讲,是的-在Unix上,“一切都是文件”。好吧,它不一定是磁盘上的文件,但实际上,您可以根据需要使用磁盘上的文件。
shm_open
正式在其自己的命名空间中接受命名共享内存对象的名称。它们需要以单个斜杠开头,并且不应包含另一个斜杠。您可以根据需要命名它们,但是由于它是一个全局名称空间,因此最好生成随机名称(正确使用O_CREAT|O_EXCL
来检查冲突)并通过其他一些渠道(例如,在应用程序实例使用的配置文件),这样就不会使其成为系统范围内的单例。实际上,在Linux以及其他常见系统上,共享内存名称空间只是一个目录/dev/shm
,通常将其安装为非持久(内存中)文件系统类型,以避免对磁盘进行浪费的写操作。
没有物理内存地址;它可能会有所不同,有时可能根本不存在(如果换出页面或页面整洁未触动时)。映射的共享内存对象的虚拟地址也不是映射它的不同进程所共有的。标识内存的是共享内存目标文件(由打开的文件描述符对其进行引用)其中的偏移量。因此,为了使用在不同进程的地址空间中独立映射的共享内存,您需要使用与基址的偏移量,而不是绝对指针,在需要指针时将偏移量添加到基址(例如,传递给同步基元用于共享内存中的互斥量,条件变量,信号量等,或者供您自己使用)。