我有一些程序在文件或某些内存缓冲区中处理一些数据。我想提供统一的方法来处理这些案件。
我可以1)mmap文件,以便我们可以统一处理它们作为内存缓冲区; 2)使用fopen和fmemopen创建FILE *,以便将它们统一访问为FILE *。
但是,我无法使用上述任何一种方法。我需要将它们作为文件描述符处理,因为我使用的其中一个库只接受文件描述符,并且它在文件描述符上进行mmap。
所以我的问题是,给定一个内存缓冲区(我们可以假设它与4K对齐),我们能得到一个由这个内存缓冲区支持的文件描述符吗?我在其他一些问题中看到popen是一个答案,但我不认为popen中的fd可以是mmap-ed。
答案 0 :(得分:8)
您无法从“某些内存区域”轻松创建文件描述符(除了C标准库之外,没有用)。但是,您可以创建共享内存区域,获取文件描述符作为回报。
的shm_open(3)
创建并打开新对象,或打开现有对象。这类似于open(2)。调用返回文件描述符,供下面列出的其他接口使用。
列出的接口中有mmap
,这意味着您可以像对内存映射常规文件一样“内存映射”共享内存。
因此,对于这两种情况(文件或内存缓冲区)使用mmap
应无缝工作,如果只控制该“内存缓冲区”的创建。
答案 1 :(得分:0)
您可以将(可能使用mmap
)数据段写入基于tmpfs
的文件(可能位于/run/
目录下),然后将打开的文件描述符传递给您的库。