Проецирование файлов в память на 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 Ushort
            st_ino As ino_t
            st_mode As mode_t
            st_nlink As nlink_t
            st_uid As uid_t
            st_gid As gid_t
            st_rdev As dev_t
            __pad2 As Ushort
        #ELSE
            st_ino As ino_t
            st_nlink As nlink_t
            st_mode As mode_t
            st_uid As uid_t
            st_gid As gid_t
            __pad0 As Long
            st_rdev As dev_t
        #ENDIF
        st_size As off_t
        st_blksize As __blksize_t
        st_blocks As blkcnt_t
        st_atime As timespec
        st_mtime As timespec
        st_ctime As timespec
        #IFNDEF __fb_64bit__
            __glibc_reserved4 As Uinteger
            __glibc_reserved5 As Uinteger
        #ELSE
            __glibc_reserved(2) As Uinteger
        #ENDIF
    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