C 在什么情况下,我们在mmap中将文件描述符设置为-1?

C 在什么情况下,我们在mmap中将文件描述符设置为-1?,c,linux,linux-kernel,mmap,C,Linux,Linux Kernel,Mmap,我的问题如下: 在某些情况下,人们使用mmap而不是读取文件。其中一个代码是: *mapping = mmap(NULL, *mapping_size, PROT_READ | PROT_WRITE, MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 上面的代码试图分配大量内存。 我想知道mmap在这种情况下是做什么的,它是如何工作的。每个人都在谈论mmap wrt文件的优点。但fd设置为-1的这类代码很常见。这意味着什么,这

我的问题如下: 在某些情况下,人们使用mmap而不是读取文件。其中一个代码是:

 *mapping = mmap(NULL, *mapping_size, PROT_READ | PROT_WRITE,
      MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
上面的代码试图分配大量内存。 我想知道mmap在这种情况下是做什么的,它是如何工作的。每个人都在谈论mmap wrt文件的优点。但fd设置为-1的这类代码很常见。这意味着什么,这样做的好处是什么。?我希望有人能澄清我的疑问,因为我的模棱两可,所以不能完全问清楚


谢谢

这是一种用于将动态新内存映射到应用程序中的方法。对于实现malloc和friends的libc来说,这是实际分配内存的一种可能的技术

但fd设置为-1的这类代码很常见。这意味着什么,这样做的好处是什么

====

mmap用于在虚拟内存的某处创建内存映射,该映射可由发出mmap的进程引用。指定文件描述符允许将内存调出到磁盘。此外,由于只有当前访问的文件区域必须加载到内存中,因此可以将大小始终大于物理内存和磁盘交换空间的文件映射到内存中。看

有几个用例不希望指定文件描述符并映射匿名内存区域。其中之一可能是扩展进程的堆。另一种可能是共享数据而不将数据持久化到文件中,因此不会产生额外的I/O开销。再次从GNU文档:

无名氏地图

阿农地图

此标志告诉系统创建匿名映射,而不是连接到文件。忽略filedes和off,并且区域>初始化为零

匿名映射被用作一些系统上扩展堆的基本原语。它们还可用于在多个>任务之间共享数据,而无需创建文件

在某些系统上,使用私有匿名MMAP比使用malloc处理大数据块更有效。这不是GNU>C库的问题,因为包含的malloc自动使用mmap,其中 合适

但是,请注意,匿名mmap ed内存只能从进程内部或其子进程访问。由于内存是匿名的,因此无法引用它!必须使用shm_open将共享内存包装到对象中,并使其可用于其他进程。请参阅shm_开放手册粗体部分的专家是我的:

shm_open创建并打开新的或现有的POSIX共享内存对象。POSIX共享内存对象实际上是一个句柄,它可以被不相关的进程用于共享内存的相同区域

fd=-1只是一些系统接受您的分配而忽略文件描述符的遵从性。请参阅Linux上man mmap的专家:

无名氏地图

映射没有任何文件支持;其内容初始化为零。忽略fd和offset参数;但是,如果MAP_匿名或 MAP_ANON已指定,可移植应用程序应确保这一点。MAP_ANONYMOUS在中的使用 仅从内核2.4开始,Linux才支持与MAP_SHARED的结合


有一些关于此系统特定行为的参考。

来自:如果指定了MAP\u ANONYMOUS或MAP\u ANON,则某些实现要求fd为-1,并且便携式应用程序应确保这一点。感谢您的回复。曼恩说,地图没有任何文件支持;其内容初始化为零。忽略fd和offset参数;但是,如果指定了MAP_ANONYMOUS或MAP_ANON,则某些实现要求fd为-1,可移植应用程序应确保这一点。仅从内核2.4开始,Linux才支持将MAP_ANONYMOUS与MAP_SHARED结合使用。我想知道我们使用匿名的任何实际案例!!?用非常简洁的话来说:每次你不想把你的内存连接到磁盘上的一个文件时。是的,没错。但是我想知道fd=-1的情况,这里不涉及任何文件!当平台特定手册规定其为-1时,则需要此项。谢谢您的回复。但malloc将足以正确分配内存。为什么必须使用mmap和ANON来分配fd=-1的内存。??mmap还有其他用途,而不是对文件进行操作。它需要动态分配内存。但是为什么不使用malloc,为什么再次使用mmap,优点和缺点以及关于mmap的任何其他见解都将非常受欢迎。malloc可能非常适合您。想要实现自己的内存分配的特殊项目可以使用它,比如ElectricFence、valgrind、UML.yes。但即使是这些实现也可以通过mall来完成 对吗??这个mmap提供了什么特别的优势或灵活性?可能什么都没有,因为malloc对于巨大的内存量来说,将使用匿名mmap来分配mem。