【发布时间】:2015-06-25 09:31:48
【问题描述】:
如果在我的 c++ 代码中,我使用 mmap() 来共享一个全局变量,我从 linux 终端运行一个版本的程序,在同一台机器上,我打开另一个终端,并运行同一个程序,这两个程序会访问同一个共享的内存吗?
【问题讨论】:
如果在我的 c++ 代码中,我使用 mmap() 来共享一个全局变量,我从 linux 终端运行一个版本的程序,在同一台机器上,我打开另一个终端,并运行同一个程序,这两个程序会访问同一个共享的内存吗?
【问题讨论】:
这取决于您如何使用mmap。如果两个程序都创建同一个文件(或共享内存节点或其他)的共享映射,是的。如果它们映射不同的文件,或者创建私有或匿名映射,则不会(尽管私有映射将使用写时复制,因此内存是共享的,直到任一进程写入它为止)。
【讨论】:
只有在以下情况下,两个进程才会看到内存映射区域的相同内容
MAP_SHARED 标志完成的。如果进行匿名文件映射,则没有后备文件,因此进程不会看到彼此的内容。要实现共享内存,您可以在tmpfs 挂载中创建一个文件(通常/dev/shm 可用)。或者,在 Linux 上,给定足够新的内核(Linux 3.17 或更高版本),系统调用memfd_create 可用于在一个进程中创建一个没有文件系统条目的tmpfs 文件,并与其他进程共享可以使用file descriptor passing 来让他们访问该文件。
【讨论】: