Проецирование файлов в память на Linux
Исходник ниже показывает как можно проецировать файлы в память в системе Linux. В Windows это делается при помощи функций CreateFileMapping , MapViewOfFile , UnmapViewOfFile . В Linux это функции:
mmap - выполняет непосредственно проецирование файла в память и возвращает указатель на память
munmap - отключает проецирование объекта в адресное пространство
Существуют еще функции (в исходнике их нет):
msync - для синхронизации содержимое файла с его отражением в памяти
mremap - увеличение\уменьшение размера памяти для проекции файла , чем то напоминает Reallocate :)
Большая часть исходника ниже декларации и определения , поскольку в стандартных заголовках FB далеко не все присутствует.
#INCLUDE "crt.bi" ' ///////////////декларируем функции и прочее//////////// Extern "C" Type Tstat st_dev As dev_t #IFNDEF __FB_64BIT__ pad1 As Long st_ino As ino_t st_mode As mode_t st_nlink As nlink_t #ELSE st_ino As ino_t st_nlink As nlink_t st_mode As mode_t #ENDIF st_uid As uid_t st_gid As gid_t st_rdev As dev_t #IFNDEF __FB_64BIT__ pad2 As Long #ENDIF st_size As off_t st_atime As time_t st_atime_usec As time_t st_mtime As time_t st_mtime_usec As time_t st_ctime As time_t st_ctime_usec As time_t st_blksize As Uinteger 'blksize_t st_blocks As blkcnt_t End Type Declare Function mmap(addr As Any Ptr , Len As size_t, prot As Integer, flags As Integer, fd As Integer, offset As off_t) As Any Ptr Declare Function munmap(addr As Any Ptr, Len As size_t ) As Integer Declare Function close64 Alias "close" (Byval __fd As Long) As Long Declare Function stat (Byval As Zstring Ptr, Byval As Tstat Ptr) As Long #DEFINE PROT_READ &h1 #DEFINE PROT_WRITE &h2 #DEFINE PROT_EXEC &h4 #DEFINE PROT_SEM &h8 #DEFINE PROT_NONE &h0 #DEFINE MAP_SHARED &h01 #DEFINE MAP_PRIVATE &h02 #DEFINE MAP_TYPE &h0f #DEFINE MAP_FIXED &h10 #DEFINE MAP_ANONYMOUS &h20 End Extern '-/////////////////////////////////- Const sFileName = "/usr/share/alsa/alsa.conf" ' ///////////////открываем файл для чтения//////////// Dim As Integer fp = open64(sFileName, O_RDONLY, 0) '-/////////////////////////////////- If fp Then ' ///////////////узнаем размер файла////////////////// Dim As Tstat st stat("/usr/share/alsa/alsa.conf" , @st) Dim As Integer iSizeFile = st.st_size '-/////////////////////////////////- ' ///////////////смещение чтения (должно быть кратно размеру страницы , можно узнать при помощи getpagesize), оставим с нуля////////////////// Dim As off_t iOffset '-/////////////////////////////////- ' ///////////////проецируем файл в память///////////////// Dim As Byte Ptr pbData = mmap(0, iSizeFile, PROT_READ, MAP_PRIVATE, Cint(fp) , iOffset) '-/////////////////////////////////- If pbData <> Cast(Any Ptr ,-1) Then ' ///////////////поработаем с объектом///////////////// Dim As zstring*201 pszText memcpy(Sadd(pszText),Cast(Byte Ptr,pbData),200) ? pszText '-/////////////////////////////////- ' ///////////////отключаем проецирование объекта в адресное пространство munmap(pbData , iSizeFile) '-/////////////////////////////////- Else ? "Проецирование не удалось." Endif ' ///////////////закрываем файл//////////// close64(fp) '-/////////////////////////////////- Endif ? ? "Нажмите любую клавишу..." Sleep