- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想在独立运行的进程之间共享内存,而不是fork
。
我已经阅读了 mmap
和 shm_open
的手册页,但仍然对用法感到困惑。
mmap
会有fd
参数呢?这是否意味着内存实际上是通过文件共享的? shm_open
似乎接受一个文件名作为它的参数,所以它实际上打开了一个文件?谁能给出一些在两个进程之间共享内存的示例代码?比如说,我们有进程 producer
和一个 consumer
进程,它们将如何通过 mmap
共享的内存段进行通信?
最佳答案
本质上,是的——在 unix 上“一切皆文件”。不完全是,它不一定是磁盘文件,但事实上,如果需要,您可以使用磁盘文件。
正式地,shm_open
在它自己的命名共享内存对象的命名空间中接受一个名称。它们需要以单个斜杠开头,并且不应包含另一个斜杠。您可以随意命名它们,但由于它是一个全局命名空间,因此最好生成随机名称(正确使用 O_CREAT|O_EXCL
来检查冲突)并通过其他 channel (例如state 目录在您的应用程序实例使用的配置文件中达成一致),这样您就不会使其成为系统范围的单例。实际上,在 Linux 和其他常见系统上,共享内存命名空间只是一个目录 /dev/shm
,通常作为非持久(内存中)文件系统类型安装,以避免浪费写入一个磁盘。
没有物理内存地址;它可能会有所不同,有时可能根本不存在(如果换出或页面干净且未触及)。映射的共享内存对象的虚拟地址也不为映射它的不同进程所共有。标识内存的是共享内存对象文件(由打开的文件描述符引用)其中的偏移量。因此,为了使用独立映射到不同进程地址空间的共享内存,您需要使用基址的偏移量,而不是绝对指针,在需要指针时将偏移量添加到基址(例如,传递给同步原语共享内存中的互斥量、条件变量、信号量等,或供您自己使用)。
关于c++ - 如何使用mmap和shm_open在多个独立进程之间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120655/
这段代码: extern crate libc; use libc::{O_CREAT, O_RDWR, shm_open}; use std::ffi::CString; fn shm_create
我正在像这样创建一个新的共享内存对象 int fd = shm_open("somekey", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG); 返回值很好,我希望在/d
我正在尝试使用 shm_open() 创建一个新的共享内存文件,但我得到错误号 2(没有这样的文件或目录)。 shm_open ("/DIAG_public", O_CREAT | O_RDWR, S
我的一个 friend 正在为内存受限的 Linux 系统开发一个库。他提议使用 shm_open 为用户计算机上多个不同程序之间的进程间通信分配多个合理大小 (16MB) 的内存。 出现的问题是,如
我正在尝试打开一个共享内存,它给我没有这样的文件或目录错误。但是我在名称区域中有一个文件和一个目录。 fd_sh = shm_open("/home/angus/c_tutorials/interv
我有两个问题: 在使用 shm_open 时,如何知道我是否打开了一个已经存在的共享内存,我正在使用 O_CREATE | O_RDWR。 我正在使用 shm_open 创建/打开一个具有某个名称的共
通常,共享内存是使用映射到进程地址空间的部分磁盘文件实现的。每当在共享区域上发生内存访问时,文件系统都会参与将更改写入磁盘,这是一个很大的开销。 通常,调用 fopen() 会返回传递给 mmap()
这样做有什么好处:shm_open 跟在 mmap 之后? 为什么不创建一个常规文件,然后将 fd 传递给 mmap? 我看不出 shm_open 的优势 - 这些只是引用,不是吗? 我看过全家的男人
POSIX shm_open() 函数返回可用于访问共享内存的文件描述符。这是非常方便的,因为可以使用所有控制文件描述符的传统机制来控制共享内存。 唯一的缺点是 shm_open() 总是需要一个文件
我正在编写一个使用 POSIX 共享内存的程序,但有一个我不确定如何修复的错误。我寻找了类似的问题,但找不到与此特定问题相关的任何问题。 涉及两个文件 - server.c,其中包含程序运行的代码,以
我得到了以下成功执行的 C 代码: ... fd = shm_open(memory_package_name, O_CREAT | O_RDWR | O_EXCL , S_IRUSR | S_IWU
我有一个公共(public)的共享内存空间,多个进程可以读写它。我在使用 shm_open() 访问共享内存并使用 mmap() 写入内存映射文件时遇到了这个问题。但是,在调用我的包装器方法几次之后,
我有以下结构, typedef struct arrays { int *array; int max; int min; } array; 其中*array指向一个动态分配的
我不想创建一个新的共享内存对象,如果它不退出的话。而是在这种情况下返回错误。如果它已经存在,我只想打开它。 最佳答案 阅读shm_overview(7) & shm_open(3) . 如果 shm_
我目前正在 ubunto 上开发一个应用程序并调用 shm_open,目前默认路径在/var/run/shm 中。但是我需要将其更改为/tmp。简单地尝试以下是行不通的: fd = shm_open(
在 Linux 中,我想与其他进程共享我的进程的一些内存内容。其中一种方法是使用 shm_open 和 mmap。如下所示。 /* Create a new memory object */ fd =
我正在尝试使用我在网上找到的示例和文档来创建共享内存区域。我的目标是 IPC ,所以我可以让不同的进程相互通信。 这是我的 C 文件 #include #include #include #in
我正在使用boost库在C++程序的IPC上工作,并且发现如果我请求的内存大小大于其容量,boost::shared_memory_object不会抛出任何错误。在堆栈溢出中至少已两次询问此问题: W
描述: 我有一个名为“Projet”的项目目录,其中包含两个名为“Serveur”和“Client”的目录。 (1)Serveur包含serveur.c (2)Client包含client.c 引用t
我刚刚阅读了 shm_open 和 shmat 的联机帮助页,并正在尝试以下示例。在文件 test.c 中, int main(int argc, char **argv) { void *ret
我是一名优秀的程序员,十分优秀!