Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 7 стр.

UptoLike

Составители: 

7
Функция идентична lseek за исключением того, что работает с 64-битными
файлами.
Возможно открыть несколько дескрипторов для одного и того же файла. В этом
случае позиционирование указателя для одного дескриптора не влияет на другие.
off_t
Это арифметический тип данных, используемый для представления размеров
файлов. В Linux это значение равно long int. Если компиляция выполнялась с флагом
_FILE_OFFSET_BITS == 64, этот тип данных заменяется off64_t.
off64_t
Этот тип данных используется также, как и off_t.
Ввод/вывод с отображением на память
В современных операционных системах существует возможность отобразить
файл на область в оперативной памяти. Когда это сделано, доступ к файлу можно
получить как к обычному массиву.
Этот способ более эффективен, чем использование read и write, так как можно
загружать в память только те области файлы, которые необходимы программе.
Механизм доступа к еще не загруженных в память участкам файла идентичен тому,
который используется для виртуальной памяти при реализации свопинга. Так как
обработанные участки файла могут быть сохранены обратно на диск, существует
возможность отображать в память файлы гораздо большего размера, чем объем
оперативной памяти. Единственным ограничителем является размер адресного
пространства операционной системы. В 32-битной операционной системе
теоретический лимит размера файла – 4 Gb, в действительности этот размер несколько
меньше, так как некоторые участки памяти уже заняты операционной системой и
другими программами.
Отображение в память работает только с целыми страницами памяти. Поэтому
адреса буферов для отображения должны быть выровнены на страницу, а длина
округлена. Для определения размера страницы памяти можно использовать следующий
вызов:
size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
Следующие функции определены в заголовочном файле <sys/mman.h>.
void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int FLAGS,
int FILEDES, off_t OFFSET)
Функция создает новое отображение в память участка файла FILEDES,
ограниченного смещениями OFFSET и (OFFSET+LENGTH). ADDRESS задает
предпочтительный начальный адрес буфера отображения. Если начиная с этого адреса
существовало какое-либо другое отображения, оно уничтожается. Этот адрес может
быть динамически изменен если не задан флаг MAP_FIXED.
Аргумент PROTECT задает флаги, которые контролируют тип запрашиваемого
доступа. Он может принимать следующие значения: PROT_READ, PROT_WRITE и
PROT_EXEC, которые соответственно означают доступ на чтение, запись и исполнение.
Заметим, что многие аппаратные системы не могут предоставить доступ только на
запись без предоставления доступа на чтение.
Аргумент FLAGS контролирует метод отображения и может принимать
следующие значения:
MAP_PRIVATE Означает, что изменения, вносимый в данные, хранящиеся в
памяти никогда не будут отображены в соответствующем
файле. Другие процессы, работающие с тем же файлом не
смогут увидеть изменения, происходящие в файле. Такое
отображение называется частным;
        Функция идентична lseek за исключением того, что работает с 64-битными
файлами.
        Возможно открыть несколько дескрипторов для одного и того же файла. В этом
случае позиционирование указателя для одного дескриптора не влияет на другие.
       off_t
        Это арифметический тип данных, используемый для представления размеров
файлов. В Linux это значение равно long int. Если компиляция выполнялась с флагом
_FILE_OFFSET_BITS == 64, этот тип данных заменяется off64_t.
       off64_t
       Этот тип данных используется также, как и off_t.

       Ввод/вывод с отображением на память
       В современных операционных системах существует возможность отобразить
файл на область в оперативной памяти. Когда это сделано, доступ к файлу можно
получить как к обычному массиву.
       Этот способ более эффективен, чем использование read и write, так как можно
загружать в память только те области файлы, которые необходимы программе.
Механизм доступа к еще не загруженных в память участкам файла идентичен тому,
который используется для виртуальной памяти при реализации свопинга. Так как
обработанные участки файла могут быть сохранены обратно на диск, существует
возможность отображать в память файлы гораздо большего размера, чем объем
оперативной памяти. Единственным ограничителем является размер адресного
пространства операционной системы. В 32-битной операционной системе
теоретический лимит размера файла – 4 Gb, в действительности этот размер несколько
меньше, так как некоторые участки памяти уже заняты операционной системой и
другими программами.
       Отображение в память работает только с целыми страницами памяти. Поэтому
адреса буферов для отображения должны быть выровнены на страницу, а длина
округлена. Для определения размера страницы памяти можно использовать следующий
вызов:
       size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
       Следующие функции определены в заголовочном файле .
       void * mmap (void *ADDRESS, size_t LENGTH,int PROTECT, int FLAGS,
int FILEDES, off_t OFFSET)
        Функция создает новое отображение в память участка файла FILEDES,
ограниченного смещениями OFFSET и (OFFSET+LENGTH). ADDRESS задает
предпочтительный начальный адрес буфера отображения. Если начиная с этого адреса
существовало какое-либо другое отображения, оно уничтожается. Этот адрес может
быть динамически изменен если не задан флаг MAP_FIXED.
        Аргумент PROTECT задает флаги, которые контролируют тип запрашиваемого
доступа. Он может принимать следующие значения: PROT_READ, PROT_WRITE и
PROT_EXEC, которые соответственно означают доступ на чтение, запись и исполнение.
Заметим, что многие аппаратные системы не могут предоставить доступ только на
запись без предоставления доступа на чтение.
        Аргумент FLAGS контролирует метод отображения и может принимать
следующие значения:
MAP_PRIVATE              Означает, что изменения, вносимый в данные, хранящиеся в
                         памяти никогда не будут отображены в соответствующем
                         файле. Другие процессы, работающие с тем же файлом не
                         смогут увидеть изменения, происходящие в файле. Такое
                         отображение называется частным;


                                                                                7