获取fork()的copy-on-write行为,不带fork()

时间:2012-06-12 14:38:25

标签: c fork copy-on-write

我有一个大缓冲区:

char *buf = malloc(1000000000); // 1GB

如果我分叉一个新进程,它将有一个buf,它与父进程的buf共享内存,直到一个或另一个写入它。即使这样,内核也只需要分配一个新的4KiB块,其余的将继续被共享。

我想复制一下buf,但我只想改变一点副本。我想要不写分支的写时复制行为。 (就像你在分叉时免费获得的那样。)

这可能吗?

1 个答案:

答案 0 :(得分:9)

您需要在磁盘或块的POSIX共享内存段(shm_open)上创建文件。第一次,用MAP_SHARED映射它。当您准备好制作副本并切换到COW时,请使用mmapMAP_FIXED再次致电MAP_PRIVATE以覆盖原始地图的顶部,并使用MAP_PRIVATE制作第二份副本。这应该可以获得你想要的效果。