是否可以将一段共享内存转换为私有内存?

时间:2011-06-09 14:58:13

标签: c memory shared

假设我有一个c程序(在linux环境中),它使用共享内存向多个进程发送数据。让我们稍后在程序中说并行进程完成,我只有一个进程。现在但我想fork()关闭另一个进程,但是这次我不希望共享内存段,我希望父进程和子进程能够修改值而不会相互影响,就好像这是私人记忆。有没有办法做到这一点;将共享内存转换为专用内存但是它在虚拟内存中占用相同的空间,还是使共享内存可以写入?

1 个答案:

答案 0 :(得分:3)

嗯,我从便携式POSIX API中想到的唯一方法就是让子映射一些相同大小的新段(随机),复制数据,然后分离原始段并将新段重新附加到正确的地址。听起来很难看。

您可以在完成后取消链接新细分,以防止其他人附加。

现在我看一下手册页,如果你有一个FD到shm对象,你可以尝试将shm对象重新映射到正确地址的子节点中的MAP_PRIVATE。但是,“未指定mmap()调用后对文件所做的更改是否在映射区域中可见。”因此,您需要测试并危险地生存或使用其他技术。