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

时间:2012-08-22 21:32:22

标签: linux mmap

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

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

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

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

2 个答案:

答案 0 :(得分:8)

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

来自shm_overview (7)

  

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

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

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

答案 1 :(得分:0)

您可以将(可能使用mmap)数据段写入基于tmpfs的文件(可能位于/run/目录下),然后将打开的文件描述符传递给您的库。