【发布时间】:2015-06-01 22:15:48
【问题描述】:
我正在使用 C 语言开发一个项目,该项目使用 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
第 1 部分)
这里是我的困惑众生。假设这个进程现在已经完成了对该位置的访问,因为它只是为另一个进程设置数据来读取。我还要打电话给munmap()吗?
我希望其他进程仍然可以访问当前进程设置的所有这些数据。通常,您不会在 malloc'ed 指针上调用 free(),直到不再需要永久使用它。但是,我知道当这个过程退出时,取消映射无论如何都会自动发生。数据是保留在段内,还是只是保留了分配的大小和名称?
第 2 部分)
我们现在正在处理需要访问和读取该共享段的其他应用程序。我知道我们现在用shm_open() 打开那个段,然后用mmap() 执行相同的映射操作。现在我们可以访问该段中的结构。当我们从这个进程(不是创建数据的进程)调用munmap() 时,它会从该指针“取消链接”我们,但是数据仍然可以访问。这是否假定进程 1(创建者)有 NOT 称为 munmap()?
【问题讨论】:
标签: c linux posix shared-memory mmap