如何创建可由多个进程访问的共享内存段

时间:2012-04-09 12:58:51

标签: c++ linux

我们对单个进程中多个线程访问的共享数据非常熟悉。但是,我们如何才能使多个进程共享一块内存呢?

3 个答案:

答案 0 :(得分:1)

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

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

实际上,这取决于你想要做什么。如果您只是fork()来创建其他进程,则子进程与父进程共享内存,并具有某些(已记录的)异常。除非你致电exec()。使用fork()而不使用exec()会导致无数的麻烦,所以除了简单的情况外不应该这样做。

答案 1 :(得分:1)

有关详细信息,请参阅shm_overview(7),但这里是一个快速运行的函数来调用创建/删除匿名内存映射:

  • shm_open(2)创建和/或附加到共享内存并为其获取文件描述符
  • 可选ftruncate(2),用于在创建
  • 时设置内存段的大小
  • mmap(2)将共享内存映射到您的进程地址空间
  • munmap(2)从流程地址空间中删除映射
  • shm_unlink(3)删除共享内存段

答案 2 :(得分:0)

为了完成其余的答案,您还可以使用shmget(2)管理共享内存块以进行创建,并shmat(2)进行附加。这就是Linux版本的Chrome浏览器用于在其进程之间共享内存的内容。