LINUX.ORG.RU

Можно ли сделать фиктивный файл с произвольным доступом в буффер памяти вместо диска.

 


0

2

Или как обмануть библиотеку и подсунуть ей буфер вместо файла.

Есть библиотека, менять код которой, по условиям задачи не следует. По указанному ей пути она открывает файл для произвольного доступа на запись (использует fseek() и всё такое). Существуют ли какие-нибудь средства, дающие возможность сделать фиктивный файл, отображаемый в адресном пространстве файловой системы, но по сути являющимся буфером в памяти, что бы можно было передать путь к нему библиотеке и получать её вывод без использования реального файлового ввода вывода на диск? mkfifo() отметается, т.к. позволяет только последовательный доступ, pipe() и fmemopen() не имеют файловых имён.

★★★

см. FUSE. А там уже хоть в память мапь, хоть на ходу генерируй контент, хоть что угодно.

CrX ★★★★★
()
Ответ на: комментарий от normann

А менять и не надо. Монтируется в нужный пустой каталог и всё.

Если и это не годится, озвучь конечную цель, без этого непонятно, какие ограничения.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

Положи файл в tmpfs. Он всё хранит в ОЗУ.

ox55ff ★★★★★
()
Ответ на: комментарий от normann

Ничего там сложного нет. Загугли самые хеллоуворлды по FUSE, там практически и есть то, что тебе надо.

CrX ★★★★★
()

можно ещё подменить системные (и библиотечные) вызовы через LDPRELOAD; в open() - если запрашивается доступ к требуемому файлу то отдаёшь левый дескриптор и подменяешь к нему все прочие write() seek(), close() на работу в буфере

MKuznetsov ★★★★★
()

А какова цель-то? Избежать дискового IO, или что?

Так,

  • ln на файл в tmpfs
  • ln на /dev/null в некоторых случаях (в зависимости от того какие вызовы делает библиотека и проверяет ли что вернул fseek, например)
  • подмена open через LD_PRELOAD
slovazap ★★★★★
()

я проверял, сейчас на С такое несделать, только на Rust можно, он уже в ядре живет

передать путь к нему библиотеке и получать её вывод без использования реального файлового ввода вывода на диск

а чо, tmpfs на localhost отменили уже?

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 5)

Найти каталог который tmpfs (обычно это /tmp/) и создать файл в нем.

AntonI ★★★★★
()

Ты точно хочешь memfd:

 MEMFD_CREATE(2)            Linux Programmer's Manual           MEMFD_CREATE(2)

NAME
       memfd_create - create an anonymous file
cumvillain
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.