системный вызов для сопоставления памяти с дескриптором файла (обратный 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 ... */

Какой системный вызов или вызовы я могу использовать для этого?


person Kaleb Pederson    schedule 12.05.2010    source источник


Ответы (3)


Вы должны проверить shm_open().

person Enquimot    schedule 01.10.2010

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

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

person Randy Proctor    schedule 12.05.2010
comment
Оказывается, fileno() не работает как в Linux, так и во FreeBSD (и я предполагаю, что в других), когда FILE* исходит из fmemopen или чего-то подобного. Без возможности получить дескриптор файла я не уверен, что у нас есть решение. - person Kaleb Pederson; 21.05.2010
comment
fmemopen также может быть реализован с использованием funopen в BSD. Одна реализация доступна по адресу redmine.openinfosecfoundation.org/attachments/105/ - person Kaleb Pederson; 21.05.2010
comment
fork() достаточно тяжеловесен для этой цели. Вместо этого я бы предложил использовать нить. Было бы еще лучше использовать select() для мультиплексирования между чтением и записью из канала, но я думаю, что это не вариант. - person Sven; 01.09.2010
comment
Это не сработает, поскольку fmemopen() просто создает FILE*, поддерживаемый данным буфером памяти. Дескриптор файла не создан. - person Maxim Egorushkin; 08.11.2011

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

person Maxim Egorushkin    schedule 08.11.2011