C 调整共享匿名MMAP的大小
例如,假设我创建了一个共享匿名内存映射,如下所示:C 调整共享匿名MMAP的大小,c,ipc,mmap,C,Ipc,Mmap,例如,假设我创建了一个共享匿名内存映射,如下所示: segment = mmap(NULL, (100) * sizeof(int)), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); 然后我做叉子。我可以从子进程更改共享内存的大小吗?这是我在《LINUX编程接口》一书中读到的内容: 在大多数UNIX实现中,一旦创建了映射,它的位置 而且尺寸不能改变。但是,Linux提供了(不可移植的)mr
segment = mmap(NULL, (100) * sizeof(int)), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
然后我做叉子。我可以从子进程更改共享内存的大小吗?这是我在《LINUX编程接口》一书中读到的内容: 在大多数UNIX实现中,一旦创建了映射,它的位置 而且尺寸不能改变。但是,Linux提供了(不可移植的)mremap() 允许此类更改的系统调用。-因此,这主要取决于您是哪个操作系统。 在LINUX上,根据文档,这是可能的:
void *mremap(void *old_address, size_t old_size,
size_t new_size, int flags, ... /* void *new_address */);
我们必须提供新旧尺寸
但是有一些限制和场景,在这些限制和场景中,此操作可能不会产生任何影响或抛出错误。请仔细阅读以下文档:
(在LINUX上)同时,我没有看到来自child/other进程的任何限制。
我的理解是,如果您能够获得共享内存地址,并且创建该地址时没有任何锁,并且尝试修改共享内存的进程具有所需的权限,那么我认为可以增加大小。根据Michael Kerrisk的这本优秀的书:(p.1081): 在大多数UNIX实现中,一旦创建了映射,就不能更改其位置和大小。但是,Linux提供了(不可移植的)mremap()系统调用,允许进行此类更改 它还声明如下: 成功时,mremap()返回映射的起始地址。由于(如果指定了MREMAP_MAYMOVE标志),该地址可能与前一个起始地址不同,因此进入该区域的指针可能不再有效。因此,当引用映射区域中的地址时,使用mremap()的应用程序应该只使用偏移量(而不是绝对指针)(参见第48.6节)
我似乎无法删除我以前的评论。无论如何,谢谢你的回复!但是,如果共享内存的地址发生更改,则子级将无法再访问它。也许有一种方法可以强制重新使用地址?可能是。首先,我认为这是不可能的。根据
mremap
和MAP\u共享的不受支持。我在文档中只看到了两个选项。我没有看到地图碎片