2012-04-09 103 views
1

我们对单个进程中多个线程访问的共享数据非常熟悉。但是,我们怎样才能让多个进程共享一块内存呢?如何创建可被多个进程访问的共享内存段

+3

谷歌有一堆东西在上面。您正在寻找'/ dev/shm'''shmget'手册页以及与它们相关的所有内容。附: POSIX定义的接口当然是C. – TC1 2012-04-09 13:01:13

+0

可能的重复[如何在Linux中的许多应用程序库中有一个共享变量?](http://stackoverflow.com/questions/1938244/how-to-have-a -shared-variable-in-library -in-many-applications-in-linux) – 2012-04-09 13:03:00

+0

请记住,你必须小心地同步对共享内存的访问。使用更多结构化的机制(如管道和信号灯)可能更容易。它可能也值得一看[Boost.Interprocess](http://www.boost.org/doc/libs/1_49_0)。 – 2012-04-09 13:32:33

回答

1

你想要的程序是mmap,它接受一个文件描述符,并返回一个指向一块内存的指针。多个进程然后都使用相同的文件名来获得它。当然,你需要协调阅读/写作,以便没有人需要处理损坏的数据。

文件名可以是文件系统中实际文件的文件名,也可以是传递给shm_open的名称。

其实,这取决于你想要做什么。如果您只需要fork()来创建额外的进程,则子进程会与父进程共享内存,并带有某些(记录的)异常。除非,直到你致电exec()。然而,使用fork()而不使用exec()可能导致无数的头痛,除了简单情况外,不应该这样做。

+0

使用文件相当笨拙;如果你只是想共享内存,那么用'shmget'的'shm_open'来创建一个共享内存对象。即使您没有安装可写文件系统,这也可以工作。 – 2012-04-09 13:27:12

+0

我其实并没有说要使用一个文件。只有一个文件名。 'shm_open'需要一个文件名。 – DRVic 2012-04-09 23:56:12

+0

fork()之后的内存共享是内核优化而不是功能的结果。它被称为[copy-on-write](https://en.wikipedia.org/wiki/Copy-on-write) – C2H5OH 2012-04-10 00:27:24

1

shm_overview(7)的细节,但这里的功能的快速破败调用创建/删除匿名内存映射:

  • shm_open(2)创建和/或连接到共享内存,并得到一个文件描述符为它
  • 可选ftruncate(2)创建
  • mmap(2)当对共享存储器映射到你的进程的地址空间中设置的存储器段的大小
  • munmap(2)以除去从进程的地址空间
  • shm_unlink(3)映射删除共享存储器段
0

为了完整性与答案的其余部分,也可以管理与shmget(2)共享存储器块,用于创建和shmat(2)用于附接。这是Google Chrome的Linux版本用于在其进程中共享内存的内容。