当前位置: 首页 > 知识库问答 >
问题:

Linux共享内存:shmget()与mmap()?

宗安翔
2023-03-14

在这个线程中,建议OP使用mmap()而不是shmget()来获取Linux中的共享内存。我访问了这个页面和这个页面以获得一些文档,但是第二个页面给出了一个关于mmap()的模糊示例。

作为一个新手,并且需要在两个进程之间共享一些信息(文本形式),我应该使用shmget()方法还是mmap()?为什么呢?

共有1个答案

景康安
2023-03-14

这两种方法都是可行的。mmap方法比shmget更具限制性,但更易于使用。shmget是旧的System V共享内存模型,具有最广泛的支持。mmap/shm_open是实现共享内存的新的POSIX方式,并且更易于使用。如果您的操作系统允许使用POSIX共享内存,那么我建议您使用它。

一些暗示:

  • 如果您通过fork创建子级,那么mmap使用map_anonymous map_shared是迄今为止最简单的方法--只需一次调用。MAP_Anonymous是POSIX未指定的Linux扩展。
  • 如果独立启动进程,但可以为它们提供共享内存名,那么shm_open(+ftruncate)+mmapwithmap_shared是两个/三个调用。在某些操作系统上需要librt
  • 如果操作系统有/dev/shm/,那么shm_open相当于在/dev/shm/中打开文件。
 类似资料:
  • 问题内容: 在此线程中,建议在Linux中使用OP 而不是获取共享内存。我访问了这个页面,这个页面来获得一些文件,但第二个方面给出了一个模糊的例子。 几乎是新手,并且需要在两个进程之间共享一些信息(以文本形式),我应该使用该方法还是?又为什么呢 问题答案: 两种方法都是可行的。该方法比限制性更强,但更易于使用。是旧的System V共享内存模型,并且支持范围最广。/ 是用于共享内存的新POSIX方

  • 创建共享内存,通过key返回id。 函数原型 #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); 参数 key 不消多说 size 欲创建的共享内存段的大小 shmflg 共享内存段的创建标识: 公共的IPC选项(在/usr/include/linux/ipc.h中定义)

  • 通过查看shmget()的手动页面,我了解到shmget()调用在内存中分配了#个页面,这些页面可以在进程之间共享。 它是否要创建内核内存页,并将其映射到进程的本地地址空间?还是为该段保留了相同的进程内存页,并将为其他附加进程共享相同的内存页? 调用shmget()时,内核将保留一定数量的段/页。 调用shmat()时,保留的段映射到进程的地址空间/页。 当一个新进程附加到同一段时,前面创建的内核

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关

  • EasySwoole对Swoole table进行了基础的封装。 方法列表 getInstance() 该方法用于获取TableManager管理器实例 add($name,array $columns,$size = 1024) 该方法用于创建一个table get($name):?Table 该方法用于获取已经创建好的table 示例代码 TableManager::getInstance()

  • shmat是shared memory attach的缩写。而attach本意是贴的意思。 如果进程要使用一段共享内存,那么一定要将该共享内存与当前进程建立联系。即经该共享内存挂接(或称映射)到当前进程。 shmdt则是shmat的反操作,用于将共享内存和当前进程分离。在共享内存使用完毕后都要调用该函数。 函数原型 #include <sys/types.h> #include <sys/shm.