如果程序是从linux中的两个终端运行的,那么fork的共享内存是共享的

时间:2015-04-18 13:00:13

标签: c++ linux fork share mmap

如果在我的c ++代码中,我使用mmap()来共享一个全局变量,我从linux终端运行一个版本的程序,在同一台机器上,我打开另一个终端,并运行相同的程序,这两个程序会访问共享的相同内存吗?

2 个答案:

答案 0 :(得分:2)

这取决于您使用mmap的方式。如果两个程序都创建了同一文件(或共享内存节点或其他)的共享映射,那么。如果它们映射不同的文件,或者创建私有或匿名映射,则为no(尽管私有映射将使用copy-on-write,因此内存将被共享,直到任一进程写入它)。

答案 1 :(得分:1)

仅当

时,两个进程才会看到内存映射区域的相同内容
  • 在两个进程中映射相同的文件
  • 两个进程中的映射都是使用MAP_SHARED标志完成的。

如果进行匿名文件映射,则没有后备文件,因此进程将不会看到彼此的内容。要实现共享内存,您可以在tmpfs挂载中创建一个文件(通常/dev/shm可用)。或者,在Linux上,给定最近足够的内核(Linux 3.17或更高版本),syscall memfd_create可用于在一个进程中创建没有文件系统条目的tmpfs文件,并与其他进程共享可以使用file descriptor passing授予他们访问该文件的权限。