В Linux, как создать файловый дескриптор для области памяти

У меня есть некоторая программа, обрабатывающая некоторые данные либо в файле, либо в некотором буфере памяти. Я хочу предоставить единый способ обработки этих случаев.

Я могу либо 1) mmap файл, чтобы мы могли обрабатывать их равномерно в качестве буфера памяти; 2) создайте FILE *, используя fopen и fmemopen, чтобы получить равномерное обращение к ним как FILE *.

Однако я не могу использовать оба способа выше. Мне нужно обрабатывать их как файловый дескриптор, потому что одна из библиотек, которые я использую, принимает только файловый дескриптор, а mmap - в дескрипторе файла.

Итак, мой вопрос, учитывая буфер памяти (мы можем предположить, что он выровнен по 4K), можем ли мы получить дескриптор файла, который поддерживается этим буфером памяти? Я видел в каком-то другом вопросе popen это ответ, но я не думаю, что fd в popen может быть mmap-ed.

Ответ 1

Вы не можете легко создать дескриптор файла (кроме стандартной библиотеки C, который не является полезным) из "некоторой области памяти". Однако вы можете создать область разделяемой памяти, получив дескриптор файла в ответ.

От shm_overview (7):

shm_open (3)
   Создайте и откройте новый объект или откройте существующий объект. Это аналогично открытому (2). Вызов возвращает дескриптор файла для использования другими интерфейсами, перечисленными ниже.

Среди перечисленных интерфейсов mmap, что означает, что вы можете "отображать карту" в общей памяти так же, как если бы память отображала обычный файл.

Таким образом, использование mmap для обеих ситуаций (буфер файла или памяти) должно работать без сбоев, если только вы управляете созданием этого "буфера памяти".

Ответ 2

Вы можете написать (возможно, используя mmap) ваш сегмент данных в файл tmpfs (возможно, в директории /run/), а затем передать открытый файловый дескриптор в свою библиотеку.