C 共享内存段中映射数据的内存管理

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()创建一个

我正在做一个C语言的项目,它在Linux系统上为IPC使用共享内存。然而,我对这些部分中的内存管理有点困惑。我正在为这个项目使用POSIXAPI

我知道如何创建共享段,如果您使用
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()

谢谢你的澄清!