SharedMemory mit mmap()

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

@ts-soft
OK, das mit "ImportC" habe ich sicherlich falsch verstanden. Sorry!
Aber wo finde ich denn nun die Lib?
Ich möchte das ganze nunmal mit OpenLibrary angehen.
Wie ich schon schrieb, Suse12+13 + Debian fehlanzeige bezüglich dieser "geheimnissvollen" Lib.

Gruß, Micha122
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von NicTheQuick »

Also ich hab keine Ahnung wie man mit mmap umgeht, aber offensichtlich hat Purebasic keine Probleme damit die Funktion in den Standardlibs zu finden:

Code: Alles auswählen

ImportC ""
	mmap.i(*__addr, __len.l, __prot.l, __flags.l, __fd.l, __offset.q)
;extern int mincore (void *__start, size_t __len, unsigned char *__vec) __THROW;
	mincore.l(*__start, __len.l, *__vec.Ascii)
	munlockall.l()
EndImport

Define a.l = 1
Debug "mmap()"
Debug mmap(@a, 4, 0, 0, 0, 0)

Dim vector.a(15)

Debug "mincore()"
Debug mincore(0, 16, @vector(0))
Debug "vector:"
For i = 0 To 15
	Debug vector(i)
Next

Debug "munlockall()"
Debug munlockall()
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

PB Zeigt im Editor (unten) auch die Syntax zum aufrufen an.

mmap_(*addr, len, prot, flags, fd, offset)

Ich interpretiere das so:
*addr = Zeiger auf einen String der den Namen des Speicherblocks angibt. Oder auch alternativ wie in Doku beschrieben 0.
len = Größe des Speicherblocks in Byte. Als Integer
prot = Schutzart z.B. PROT_READ
flags = Anforderungen/Eigenschaften z.B MAP_SHARED
fd verstehe ich leider nicht so richtig :oops:
offset wird in fast alle C- Beispielen als 0 übergeben

Hier ein schönes Beispiel mit Doku in C:
http://pronix.linuxdelta.de/C/Linuxprog ... tel9.shtml

Wünsche allen einen guten Rutsch und ein gutes neues Jahr! :D
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SharedMemory mit mmap()

Beitrag von ts-soft »

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 :wink:

Guten Rutsch,

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory mit mmap()

Beitrag von Micha122 »

Hallo Thomas,
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:
vorausgesetzt dein Code bezüglich File Descriptor ist richtig, fällt mir da echt nichts mehr zu ein.
Hab mir sogar mal ein paar Python- Beispiele angeschaut und war beeindruckt, wie einfach das da scheinbar funktioniert. :o

Ok, wenn mmap() für PB ja mal erfolgreich umgesetzt wird, werde ich es hier ja sicherlich lesen.

Danke erst mal für die Hilfe!

Gruß, Micha122
Antworten