@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
SharedMemory mit mmap()
Re: SharedMemory mit mmap()
Barcodes for PureBasic - http://micha122.bplaced.net/
- 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()
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()
Re: SharedMemory mit mmap()
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
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!
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
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!
Barcodes for PureBasic - http://micha122.bplaced.net/
- 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()
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:
Auf jeden Fall hast Du grössere Chancen, meinen Code zu korrigieren, als mit Deiner eigenen Version
Guten Rutsch,
Thomas
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
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.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: SharedMemory mit mmap()
Hallo Thomas,
Hab mir sogar mal ein paar Python- Beispiele angeschaut und war beeindruckt, wie einfach das da scheinbar funktioniert.
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
vorausgesetzt dein Code bezüglich File Descriptor ist richtig, fällt mir da echt nichts mehr zu ein.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:
Hab mir sogar mal ein paar Python- Beispiele angeschaut und war beeindruckt, wie einfach das da scheinbar funktioniert.
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