Das mit FD wird doch in meinem Beispiel bereits umgesetzt.
Hier noch mal die aktuelle Version. Nicht fertig, weil irgendwas
mit den Berechtigungen noch nicht hinhaut:
Code: Alles auswählen
DeclareModule FileMap
Declare Create(Name.s, Size.i)
Declare Open(Name.s)
Declare Close(*Mem)
EndDeclareModule
Module FileMap
EnableExplicit
Global hMap.i
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
Procedure Create(Name.s, Size.i)
hMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, @Name)
If hMap
ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
Procedure Open(Name.s)
hMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
If hMap
ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
Procedure Close(*Mem)
UnmapViewOfFile_(*Mem)
CloseHandle_(hMap)
EndProcedure
CompilerCase #PB_OS_Linux
#O_RDWR = $2
#O_CREAT = $40
#PROT_READ = $1
#PROT_WRITE = $2
#PROT_EXEC = $4
#MAP_SHARED = $1
#MAP_FILE = 0
ImportC "-lrt"
shm_open(name.p-utf8, oflag, mode)
shm_unlink(name.p-utf8)
errno_location() As "__errno_location"
EndImport
Global gSize.i, gName.s
Procedure Create(Name.s, Size.i)
Protected result
If Not Left(Name, 1) = "/"
Name = "/" + Name
EndIf
hMap = shm_open(name, #O_CREAT | #O_RDWR, 384)
If hMap > -1
gSize = Size
gName = Name
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
result = mmap64_(0, Size, #PROT_READ | #PROT_WRITE, #MAP_SHARED, hMap, 0)
CompilerElse
result = mmap_(0, Size, #PROT_READ | #PROT_WRITE, #MAP_SHARED, hMap, 0)
CompilerEndIf
If result > -1
ProcedureReturn result
Else
Debug "mmap Error:"
Debug PeekS(strerror_(PeekL(errno_location())), -1, #PB_UTF8)
EndIf
Else
Debug "shm_open Error:"
Debug PeekS(strerror_(PeekL(errno_location())), -1, #PB_UTF8)
EndIf
EndProcedure
Procedure Open(Name.s)
If Not Left(Name, 1) = "/"
Name = "/" + Name
EndIf
hMap = shm_open(name, #O_RDWR, 0)
If hMap > -1
ProcedureReturn mmap_(0, gSize, #PROT_READ | #PROT_WRITE, #MAP_SHARED, hMap, 0)
EndIf
EndProcedure
Procedure Close(*Mem)
If Not munmap_(*Mem, gSize)
shm_unlink(gName)
EndIf
EndProcedure
CompilerEndSelect
EndModule
CompilerIf #PB_Compiler_IsMainFile
Define mem = FileMap::Create("blabla", 1024)
ShowMemoryViewer(mem, 1024)
CompilerEndIf
Auf jeden Fall hast Du grössere Chancen, meinen Code zu korrigieren, als mit Deiner eigenen Version
Guten Rutsch,
Thomas