отображенные в память файлы в C - PullRequest
3 голосов
/ 26 мая 2009

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

Пример:

FILE * fp = g_fopen(...);

//Program does things to this fp.

fclose();

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

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

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

Ответы [ 3 ]

5 голосов
/ 26 мая 2009

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


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

Вот некоторые ссылки, которые на данный момент работают:

2 голосов
/ 26 мая 2009

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

0 голосов
/ 26 мая 2009

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

FILE * my_fopen()
{
    FILE * myfp
    myfp = fopen(...);
    mmap(fileno(myfp),...);
    return myfp;
}
...