我正在使用C语言开发一个项目,该项目在Linux系统上使用IPC的共享内存。但是,我对这些细分市场中的内存管理有点困惑。我正在为这个项目使用POSIX API。
我了解如何创建共享段,并且如果您无法使用shm_unlink()
正确删除它们,这些段会一直持续到重新启动。另外,我了解如何进行实际的映射和放大分别取消mmap
和munmap
取消映射。但是,这些操作的使用以及它如何影响这些共享段中的存储数据让我感到困惑。
以下是我试图正确理解的内容:
假设我使用带有shm_open()
标记的O_CREAT
创建了一个细分。这给了我一个文件描述符,我在下面的例子中命名为msfd
。现在我有一个结构,我用以下内容映射到该地址空间:
mystruct* ms = (mystruct*)mmap(NULL, sizeof(mystruct), PROT_READ | PROT_WRITE, MAP_SHARED, msfd, 0);
//set the elements of the struct here using ms->element = X as usual
第1部分)
在这里,我的困惑在哪里。让我们说这个过程现在已经完成访问该位置,因为它只是为另一个进程设置数据来读取。我还打电话给munmap()
吗?
我希望其他进程仍然可以访问当前进程设置的所有数据。通常情况下,您不会在free()
指针上拨打malloc
,直到不再需要永久使用它为止。但是,据我所知,当这个过程退出时,无论如何都会自动发生取消映射。数据是否保留在细分受众群中,或者该细分受众群是否已按照指定的大小和名称进行保留?
第2部分)
我们现在正处于需要访问和读取该共享段的其他应用程序的过程中。我知道我们现在使用shm_open()
打开该段,然后使用mmap()
执行相同的映射操作。现在我们可以访问该段中的结构。当我们从这个过程中调用munmap()
(而不是创建数据的过程)时,它会取消链接"我们从该指针,但数据仍然可访问。这是否假设进程1(创建者)的 NOT 名为munmap()
?
答案 0 :(得分:2)
数据是否在段内保留,
是
该段只是保留了它的分配大小和名称吗?
也是。
这是否假设进程1(创建者)没有调用munmap()?
没有
共享内存通过shm_create()
创建(从可用的操作系统内存中获取),从此刻开始,它会携带已写入的内容,直到通过shm_unlink()
将其返回给操作系统
shm_create()
和shm_open()
以系统(非流程)特定资源(共享)内存为导向,以系统为导向。
mmap()
和unmap()
以进程为导向,即将系统资源共享内存映射和取消映射到进程的地址空间中。