Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调整共享匿名MMAP的大小_C_Ipc_Mmap - Fatal编程技术网

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共享的
不受支持。我在文档中只看到了两个选项。我没有看到地图碎片