在linux中,如何为内存区域创建文件描述符

Kan*_* Li 11 linux mmap

我有一些程序在文件或某些内存缓冲区中处理一些数据.我想提供统一的方法来处理这些案件.

我可以1)mmap文件,以便我们可以统一处理它们作为内存缓冲区; 2)使用fopen和fmemopen创建FILE*,以便将它们统一访问为FILE*.

但是,我无法使用上述任何一种方法.我需要将它们作为文件描述符处理,因为我使用的其中一个库只接受文件描述符,并且它在文件描述符上进行mmap.

所以我的问题是,给定一个内存缓冲区(我们可以假设它与4K对齐),我们可以得到一个由这个内存缓冲区支持的文件描述符吗?我在其他一些问题中看到popen是一个答案,但我不认为popen中的fd可以是mmap-ed.

Dam*_*mon 8

您无法从"某些内存区域"轻松创建文件描述符(除了C标准库之外,没有帮助).但是,您可以创建共享内存区域,获取文件描述符作为回报.

来自shm_overview(7):

shm_open(3)
创建并打开一个新对象,或打开一个现有对象.这类似于open(2).该调用返回一个文件描述符,供下面列出的其他接口使用.

在列出的接口中mmap,这意味着您可以像对内存映射常规文件一样"内存映射"共享内存.

因此,如果只控制 "内存缓冲区"的创建mmap,两种情况(文件或内存缓冲区)的使用应该无缝地工作.

  • 如何使用memfd_create而不是shm_open?http://man7.org/linux/man-pages/man2/memfd_create.2.html (2认同)