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

fad*_*bee 8 c fork copy-on-write

我有一个大缓冲区:

char *buf = malloc(1000000000); // 1GB
Run Code Online (Sandbox Code Playgroud)

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

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

这可能吗?

R..*_*R.. 9

您将要在磁盘上创建文件或shm_open为块创建POSIX共享内存段().第一次,用它来映射MAP_SHARED.当您准备复制并切换到COW时,请mmap使用MAP_FIXED和再次调用MAP_PRIVATE原始地图的顶部,然后MAP_PRIVATE再制作第二个副本.这应该可以获得你想要的效果.

  • 有用!https://gist.github.com/2924412注意到buf的重新映射是什么意思?我似乎不需要它.非常感谢. (2认同)