Проецирование файлов в память на 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