C 共享内存段中映射数据的内存管理
我正在做一个C语言的项目,它在Linux系统上为IPC使用共享内存。然而,我对这些部分中的内存管理有点困惑。我正在为这个项目使用POSIXAPI 我知道如何创建共享段,如果您使用C 共享内存段中映射数据的内存管理,c,linux,posix,shared-memory,mmap,C,Linux,Posix,Shared Memory,Mmap,我正在做一个C语言的项目,它在Linux系统上为IPC使用共享内存。然而,我对这些部分中的内存管理有点困惑。我正在为这个项目使用POSIXAPI 我知道如何创建共享段,如果您使用shm\u unlink()无法正确删除共享段,这些共享段将一直保留到重新启动。此外,我了解如何分别使用mmap和munmap进行实际映射和取消映射。然而,这些操作的使用以及它如何影响这些共享段中存储的数据让我感到困惑 以下是我试图正确理解的内容: 假设我使用带有O\u create标志的shm\u open()创建一个
shm\u unlink()
无法正确删除共享段,这些共享段将一直保留到重新启动。此外,我了解如何分别使用mmap
和munmap
进行实际映射和取消映射。然而,这些操作的使用以及它如何影响这些共享段中存储的数据让我感到困惑
以下是我试图正确理解的内容:
假设我使用带有O\u create
标志的shm\u 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
第1部分)
我的困惑就在这里。假设这个进程现在已经完成了对该位置的访问,因为它只是为另一个进程设置要读取的数据。我仍然调用munmap()
我希望另一个进程仍然可以访问当前进程设置的所有这些数据。通常,在不再需要永久使用malloc
指针之前,您不会调用free()
。但是,我知道当这个过程退出时,取消映射会自动进行。数据是保存在段内,还是该段只是保留了其分配的大小和名称
第2部分)
我们现在正在开发另一个需要访问和读取该共享段的应用程序。我知道我们现在用shm_open()
打开该段,然后用mmap()
执行相同的映射操作。现在我们可以访问该部分的结构。当我们从这个进程(不是创建数据的进程)调用munmap()
时,它会“解除”我们与该指针的链接,但是数据仍然可以访问。这是否假定进程1(创建者)没有调用munmap()
数据是否保存在段内
对
该段是否只保留了其分配的大小和名称
也是
这是否假定进程1(创建者)没有调用munmap()
没有
共享内存是通过shm_create()
(从可用的操作系统内存中获取)创建的,从这一刻起,它将携带任何已写入的内容,直到通过shm_unlink()
返回操作系统
shm_create()
和shm_open()
act面向系统,因为(共享)内存是系统(而不是进程)特定的资源
mmap() 谢谢你的澄清!