15

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

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

但是,我不能使用上述任何一种方式。我需要将它们都作为文件描述符来处理,因为我使用的库之一只接受文件描述符,并且它在文件描述符上执行 mmap。

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

4

2 回答 2

11

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

shm_overview (7)

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

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

因此,只要您控制“内存缓冲区”的创建,就mmap可以无缝地使用这两种情况(文件或内存缓冲区) 。

于 2012-08-24T08:57:55.093 回答
1

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

于 2012-08-22T21:35:50.473 回答