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

我有一个大缓冲区:

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

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

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

这可能吗?

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