2011-06-09 158 views
3

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

+0

你是如何创建共享内存的?如果通过mmap(),您可能会找到一种方法将属性更改为MAP_PRIVATE - 尽管我不认为有一种标准的方法来更改映射。否则,不,或者只有'longhand' - 创建一个新区域,将旧区域复制到新区域,取消旧区域映射,使用新区域。如果新玩家必须与旧玩家位于同一位置,则重复此过程以将流离失所的新玩家复制到原始位置。 – 2011-06-09 15:52:12

回答

3

那么,我可以从便携式POSIX API中想到这样做的唯一方法就是让子映射某个其他位置的某个新段(随机),复制数据,然后分离原始段并将新段重新附加到正确的地址。听起来很丑。

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

现在我看看手册页,如果您有FD到shm对象,您可以尝试在右侧地址的子对象中将shm对象重新映射为MAP_PRIVATE。但是“没有指定在映射区域中是否可见mmap()调用后对文件所做的更改”,因此您需要测试该文件并且危险地运行或使用其他技术。