Отображенные в память файлы в 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.
Вот некоторые ссылки, которые на данный момент являются функциональными:
- Это оригинальная статья, опубликованная в 2001 году: создание библиотечных вставок для удовольствия и получения прибыли (доктор Доббс)
- Ссылка developers.sun.com была перепечатана первоначальным автором, возможно, с изменениями из статьи 2001 года; это репост: отладка и настройка производительности с помощью библиотечных посредников (Wayback Machine)
- Руководство по компоновщику и библиотекам для Sun Studio / Oracle Solaris Studio. Он охватывает тему вставки библиотеки с большим количеством технических деталей.
Цель файлового ввода-вывода с отображением в память состоит не в том, чтобы выполнять системные вызовы для чтения и записи, а в том, чтобы сделать работу с помощью кеша VM/buffer. Если вы скрываете тот факт, что файл был отображен в память, в чем здесь преимущество? Как бы вы узнали, по какому адресу сопоставлен файл?
Я не понимаю Вы можете использовать чтение / запись для файла, который вы создали, так что ваш my_fopen будет выглядеть так
FILE * my_fopen()
{
FILE * myfp
myfp = fopen(...);
mmap(fileno(myfp),...);
return myfp;
}