为什么要使用shm_open?

Tre*_*or 18 c linux buffer mmap shared-memory

做的有什么好处:shm_open跟着一个mmap
为什么不创建一个常规文件,然后将其传递fdmmap
我看不到它的优点shm_open- 这些只是参考,不是吗?

我读过全家人.在我看来,"秘密"在于mmaping动作 - 文件"类型"似乎毫无意义.

任何指针都会很好,尤其是性能帐户.
我的上下文是一个(循环可写的)缓冲区(比如128MB),它将被不断地写成一个进程,并且不断地从另一个进程转发.

举个例子:这个 open/mmap方法有什么问题.

编辑
准确地说,下面的一个比另一个更好:

fd = open("/dev/shm/myshm.file", O_CREAT|O_RDWR, S_IRUSR | S_IWUSR);
mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
Run Code Online (Sandbox Code Playgroud)

fd = shm_open("/myshm.file", O_RDWR|O_CREATE, S_IRUSR | S_IWUSR);
mem = mmap(...same as before...);
Run Code Online (Sandbox Code Playgroud)

当我在fs open下创建一个带有常规文件的文件/dev/shm,并向其转储了一堆垃圾时,我的可用内存下降了1G,我的可用磁盘空间保持不变.
这两种方法有什么区别?

nos*_*nos 19

如果打开和mmap()一个常规文件,数据将最终在该文件中.

如果您只需要共享一个内存区域,而不需要保留数据(这会产生额外的I/O开销),请使用shm_open().

这样的内存区域还允许您存储其他类型的对象,例如互斥锁或信号量,这些对象在大多数系统上都不能存储在mmap()的常规文件中.

  • 如果你使用shm_open或open,那么它几乎是一样的,但只记得那是linux特有的.当存在标准方法时,这将是相当无用的.如果它安装在非标准位置,shm_open会小心定位/ dev/shm. (7认同)
  • @Trevor,请注意,根据 POSIX 标准:_“对名称中除前导斜杠字符以外的斜杠字符的解释是实现定义的。”_ 为什么不坚持使用标准 API 调用并简单地解决其限制,例如通过在文件名中使用下划线或其他特殊字符来分隔逻辑部分而不是在`/dev/shm` 下创建目录? (2认同)

Lee*_*Lee 7

阅读了 的源码后shm_open,我可以说这两种方法几乎是相同的。

链接:https ://code.woboq.org/userspace/glibc/sysdeps/posix/shm_open.c.html

shm_open 只是添加 shm_dir 前缀,然后调用正常的open系统调用,没有什么特别的。