我正在研究一个在Linux系统上使用IPC共享内存的项目 . 但是,我对这些段中的内存管理有点困惑 . 我正在为这个项目使用POSIX API .
我了解如何创建共享段,并且如果您无法使用 shm_unlink()
正确删除它们,这些段将一直持续到重新启动 . 另外,我了解如何分别使用 mmap
和 munmap
进行实际映射和取消映射 . 但是,这些操作的使用以及它如何影响这些共享段中的存储数据让我感到困惑 .
以下是我正在努力理解的内容:
假设我使用带有 O_CREAT
标志的 shm_open()
创建一个段 . 这给了我一个文件描述符,我在下面的例子中命名为 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
Part 1) 这是我困惑的地方 . 让我们说这个过程现在已经完成访问该位置,因为它只是为另一个进程设置数据来读取 . 我还打电话给 munmap()
吗?
我希望其他进程仍然可以访问当前进程设置的所有数据 . 通常情况下,您不会在 malloc
'ed pointer until its use is no longer needed permanently. However, I understand that when this process exits the unmapping happens automatically anyway. Is the data persisted inside the segment, or does that segment just get reserved with it'分配的大小和名称上调用 free()
?
Part 2) 我们现在正处于需要访问和读取该共享段的其他应用程序的过程中 . 我知道我们现在使用 shm_open()
打开该段,然后使用 mmap()
执行相同的映射操作 . 现在我们可以访问该段中的结构 . 当我们从这个过程中调用 munmap()
(而不是创建数据的过程)时,它会从该指针调用它,但数据仍可访问 . 这是否假设进程1(创建者)没有调用 munmap()
?
1 回答
是 .
也是的 .
没有 .
共享内存通过
shm_create()
创建(从可用的操作系统内存中获取),从此刻开始,它会携带已写入的内容,直到通过shm_unlink()
将其返回给操作系统 ._1778879_和
shm_open()
以系统为导向,就(共享)内存而言是系统(非进程)特定资源 .mmap()
和unmap()
act面向过程,即将系统资源共享内存映射和取消映射到进程的地址空间 .