2010-05-12 3 views
6

Я хочу, чтобы иметь возможность отображать память в дескриптор файла, поэтому я могу использовать некоторые существующие функции, которым нужен файловый дескриптор. Вот в основном то, что я ищу:Системный вызов для отображения памяти в дескриптор файла (обратный mmap)?

void do_operation1(int fd); 

char data[DATA_MAX] = { /* embedded binary data */ }; 
int fd = addr_to_fd(data, DATA_MAX); 

do_operation1(fd); 
/* ... operate on fd ... */ 

Что системный вызов, или вызовы, можно использовать для достижения этой цели?

ответ

7

Некоторые реализации имеют fmemopen(). (Тогда, конечно, вам нужно позвонить fileno()).

Если у вас нет, вы можете построить его самостоятельно с помощью fork() и pipe().

+1

Оказывается, что 'fileno()' не работает как на Linux/FreeBSD (и я полагаю, что другие), когда 'FILE *' исходит из 'fmemopen' или что-то эквивалентное. Без способа получить дескриптор файла я не уверен, что у нас есть решение. –

+1

'fmemopen' также может быть реализован с помощью' funopen' на BSD. Одна реализация доступна по адресу https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

'fork()' довольно тяжелый для этой цели. Вместо этого я бы предложил использовать поток. Было бы еще лучше использовать 'select()' для мультиплексирования между чтением и записью из канала, но я предполагаю, что здесь не вариант. – Sven

2

Несомненно, просто open(argv[0], ...), просмотрите файл, чтобы найти, где начинаются ваши двоичные данные, lseek() там и все. Конечно, этот файл не будет иметь длину двоичных данных.