C mmap保护标志对进程间共享的影响

C mmap保护标志对进程间共享的影响,c,mmap,C,Mmap,保护标志是否影响进程之间的共享?如果我有一个保护读写的MMAP内存区域,只要我没有写入它,它仍然是完全共享的吗 int prot = PROT_READ|PROT_EXEC; image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0); vs: 我想在映射后对内存区域的一小部分进行小的修改,然后重新保护它,因为这比在需要时保护小部分要简单 问题是它最终是强制每个进程复制整个文件还是强制每个进程只复制我修改的部分?根据最近Linux系统的

保护标志是否影响进程之间的共享?如果我有一个保护读写的MMAP内存区域,只要我没有写入它,它仍然是完全共享的吗

int prot = PROT_READ|PROT_EXEC;
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0);
vs:

我想在映射后对内存区域的一小部分进行小的修改,然后重新保护它,因为这比在需要时保护小部分要简单

问题是它最终是强制每个进程复制整个文件还是强制每个进程只复制我修改的部分?

根据最近Linux系统的手册页,MAP_PRIVATE使用(COW)分配内存。这意味着,除非对内存进行更改,否则不会复制内存。由于COW是实现这一点的有效方法,我假设在其他*NIX系统中也是这样做的

mmap的内存被组织成大小相等的块,即所谓的页面。内存将始终以页面大小的倍数映射,即整个页面。每个页面都可以独立交换。因此,如果您在这个mmap'ed内存范围中写入了一些内容,则至少只需复制一个页面

页面大小取决于您的系统,在x86上通常为4096字节。如果您对系统的页面大小感兴趣,可以使用

#包括
long pagesize=sysconf(_SC_pagesize);
从mmap()获得的指针将已经指向页面大小的倍数,您应该向mprotect()传递一个与页面边界对齐的地址。

根据最近Linux系统上的手册页,MAP_PRIVATE使用(COW)分配内存。这意味着,除非对内存进行更改,否则不会复制内存。由于COW是实现这一点的有效方法,我假设在其他*NIX系统中也是这样做的

mmap的内存被组织成大小相等的块,即所谓的页面。内存将始终以页面大小的倍数映射,即整个页面。每个页面都可以独立交换。因此,如果您在这个mmap'ed内存范围中写入了一些内容,则至少只需复制一个页面

页面大小取决于您的系统,在x86上通常为4096字节。如果您对系统的页面大小感兴趣,可以使用

#包括
long pagesize=sysconf(_SC_pagesize);
从mmap()获得的指针将已经指向页面大小的倍数,您应该向mprotect()传递一个与页面边界对齐的地址

int prot = PROT_READ|PROT_WRITE|PROT_EXEC;
image = mmap(...)
   #include <unistd.h>
   long pagesize = sysconf(_SC_PAGESIZE);