Отображенные в память файлы в C

Я играл с отображенными в память файлами в C и задавался вопросом, есть ли способ заменить FILE * из fopen прозрачно отображаемым файлом.

Пример:

FILE * fp = g_fopen(...);

//Program does things to this fp.

fclose();

Но вместо этого возможно ли иметь FILE *fp = my_fopen(...)

Там, где моя собственная функция открыла бы файл на диске, mmap, возможно, изменила бы содержимое, а затем передала обратно ФАЙЛ *, чтобы программа не увидела ничего другого, кроме новых my_fopen() и my_fclose().

Можно ли обойтись без необходимости переписывать способ выполнения операций в программе?

3 ответа

Решение

Волшебные слова - "вставка библиотеки". Вот хороший учебник: http://developers.sun.com/solaris/articles/lib_interposers.html


Когда Oracle приобрела Sun, многие статьи исчезли и / или не доступны через веб-сайт Oracle.

Вот некоторые ссылки, которые на данный момент являются функциональными:

Цель файлового ввода-вывода с отображением в память состоит не в том, чтобы выполнять системные вызовы для чтения и записи, а в том, чтобы сделать работу с помощью кеша VM/buffer. Если вы скрываете тот факт, что файл был отображен в память, в чем здесь преимущество? Как бы вы узнали, по какому адресу сопоставлен файл?

Я не понимаю Вы можете использовать чтение / запись для файла, который вы создали, так что ваш my_fopen будет выглядеть так

FILE * my_fopen()
{
    FILE * myfp
    myfp = fopen(...);
    mmap(fileno(myfp),...);
    return myfp;
}
Другие вопросы по тегам