C 维基百科上的内存映射循环缓冲区有多好?

C 维基百科上的内存映射循环缓冲区有多好?,c,data-structures,posix,circular-buffer,C,Data Structures,Posix,Circular Buffer,我试图用C语言实现一个循环缓冲区,在Wikipedia上遇到了一个例子(于2014年7月删除)。它似乎为任何从缓冲区读取的人提供了一个非常好的接口,因为从缓冲区的末尾到开头的读取都是自动处理的。因此,所有读取都是连续的 然而,我对直接使用它有点不确定,因为我在内存映射或虚拟内存方面没有太多经验,也不确定我是否完全理解它在做什么 我想我理解的是,它将一个共享内存文件映射到内存中,大小为缓冲区的两倍。然后,每当数据写入缓冲区时,它会同时出现在内存中的两个位置。这允许所有读取都是连续的 如果有更多PO

我试图用C语言实现一个循环缓冲区,在Wikipedia上遇到了一个例子(于2014年7月删除)。它似乎为任何从缓冲区读取的人提供了一个非常好的接口,因为从缓冲区的末尾到开头的读取都是自动处理的。因此,所有读取都是连续的

然而,我对直接使用它有点不确定,因为我在内存映射或虚拟内存方面没有太多经验,也不确定我是否完全理解它在做什么

我想我理解的是,它将一个共享内存文件映射到内存中,大小为缓冲区的两倍。然后,每当数据写入缓冲区时,它会同时出现在内存中的两个位置。这允许所有读取都是连续的

如果有更多POSIX内存映射经验的人能够快速查看代码并告诉我所使用的底层机制是否真的那么有效,那将是一件非常棒的事情。例如,我是否正确地认为/dev/shm中用于共享内存的文件始终保留在RAM中,或者它是否会在某个时候写入硬盘(性能受到影响)?有什么我应该注意的地方吗

目前,我可能会对我当前的项目使用一种更简单的方法,但最好能理解这一点,以便将来将其放在我的工具箱中


提前感谢您的时间。

我认为第一个匿名
mmap
只是为了在未使用的内存中选择一些地址区域来保存这两个映射。
“/dev/shm”通常与文件系统“tmpfs”一起挂载,该文件系统将所有数据存储在交换/内存中。因此,实际上它可能会导致写入硬盘,但您的
malloc
-ed内存也有同样的机会

即使我的“/etc/fstab”中说“glibc 2.2及以上版本希望将tmpfs安装在/dev/shm上,用于POSIX共享内存(shm_open,shm_unlink)。”有些系统可能不会这样做。但我希望内存映射文件的工作原理与交换差不多,但它们会尝试尽快将数据同步到磁盘


正如
man mkstemp
所述-glibc 2.06和更早版本使用权限0666创建文件,如果有人在
mkstemp
unlink

之间捕获您的文件,这可能会导致安全漏洞。这似乎是为了共享内存,即用于进程间通信。这就是你想要的吗?如果我回忆正确,共享内存没有磁盘支持。(但那是很久以前的事了)。@Moron,有
取消链接的
,它将文件名隐藏在“/dev/shm”下,因此没有IPC。@Moron,没有其他进程可以使用的地址
mmap
该文件,因为它已取消链接,唯一的引用是保留在内存中。@ony:让我试着理解一下。您想取消/dev/shm的链接,以便可以使用它,而不让其他进程访问它@笨蛋,我想说的是,上面提到的代码与进程间通信无关。为此干杯。您提到了可能存在的安全漏洞,显然代码需要更多的思考,而不仅仅是剪切和粘贴。虽然为了公平起见,它被标记为优化。:)