SharedMemory mit mmap()
SharedMemory mit mmap()
Hallo Linux User,
würde gerne unter Linux- PB mmap() benutzen.
Google & Co habe ich natürlich schon intensiv benutzt, was aber mangels C Kenntnisse nicht so viel gebracht hat.
Hier einige Links:
http://linuxreviews.org/man/mmap/index.html.de
http://linuxreviews.org/man/mmap/index.html.de
http://linux.about.com/library/cmd/blcmdl2_mmap.htm
Die Syntax ist ja einigermaßen verständlich, aber PB kennt ja nicht mal die Konstanten.
Ein Beispiel wie ich SharedMemory damit verwirklichen könnte wäre super.
Gruß, Micha122
würde gerne unter Linux- PB mmap() benutzen.
Google & Co habe ich natürlich schon intensiv benutzt, was aber mangels C Kenntnisse nicht so viel gebracht hat.
Hier einige Links:
http://linuxreviews.org/man/mmap/index.html.de
http://linuxreviews.org/man/mmap/index.html.de
http://linux.about.com/library/cmd/blcmdl2_mmap.htm
Die Syntax ist ja einigermaßen verständlich, aber PB kennt ja nicht mal die Konstanten.
Ein Beispiel wie ich SharedMemory damit verwirklichen könnte wäre super.
Gruß, Micha122
- 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()
Wenn du unter Linux das Paket libc6-dev installierst, dann kannst du dir die mman.h-Include anschauen und findest auch die Konstanten:
Das ist jetzt die Datei '/usr/include/x86_64-linux-gnu/bits/mman.h':
So wird '#define PROT_EXEC 0x4' zum Beispiel zu
In der Datei '/usr/include/x86_64-linux-gnu/sys/mman.h' findest du dann die eigentlichen Funktionsdeklarationen, die du dann natürlich in PB entweder mit 'OpenLibrary' oder mit 'Import' einbinden musst. Bei mir ist die Bibliothek selbst hier zu finden:
Das ist jetzt die Datei '/usr/include/x86_64-linux-gnu/bits/mman.h':
Code: Alles auswählen
/* Definitions for POSIX memory map interface. Linux/x86_64 version.
Copyright (C) 2001-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_MMAN_H
# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
#endif
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
/* Protections are chosen from these bits, OR'd together. The
implementation does not necessarily support PROT_EXEC or PROT_WRITE
without PROT_READ. The only guarantees are that no writing will be
allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
#define PROT_READ 0x1 /* Page can be read. */
#define PROT_WRITE 0x2 /* Page can be written. */
#define PROT_EXEC 0x4 /* Page can be executed. */
#define PROT_NONE 0x0 /* Page can not be accessed. */
#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
growsdown vma (mprotect only). */
#define PROT_GROWSUP 0x02000000 /* Extend change to start of
growsup vma (mprotect only). */
/* Sharing types (must choose one and only one of these). */
#define MAP_SHARED 0x01 /* Share changes. */
#define MAP_PRIVATE 0x02 /* Changes are private. */
#ifdef __USE_MISC
# define MAP_TYPE 0x0f /* Mask for type of mapping. */
#endif
/* Other flags. */
#define MAP_FIXED 0x10 /* Interpret addr exactly. */
#ifdef __USE_MISC
# define MAP_FILE 0
# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
# define MAP_ANON MAP_ANONYMOUS
# define MAP_32BIT 0x40 /* Only give out 32-bit addresses. */
#endif
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
# define MAP_DENYWRITE 0x00800 /* ETXTBSY */
# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */
# define MAP_LOCKED 0x02000 /* Lock the mapping. */
# define MAP_NORESERVE 0x04000 /* Don't check for reservations. */
# define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
# define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
# define MAP_STACK 0x20000 /* Allocation is for a stack. */
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
/* Flags to `msync'. */
#define MS_ASYNC 1 /* Sync memory asynchronously. */
#define MS_SYNC 4 /* Synchronous memory sync. */
#define MS_INVALIDATE 2 /* Invalidate the caches. */
/* Flags for `mlockall'. */
#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
#define MCL_FUTURE 2 /* Lock all additions to address
space. */
/* Flags for `mremap'. */
#ifdef __USE_GNU
# define MREMAP_MAYMOVE 1
# define MREMAP_FIXED 2
#endif
/* Advice to `madvise'. */
#ifdef __USE_BSD
# define MADV_NORMAL 0 /* No further special treatment. */
# define MADV_RANDOM 1 /* Expect random page references. */
# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
# define MADV_WILLNEED 3 /* Will need these pages. */
# define MADV_DONTNEED 4 /* Don't need these pages. */
# define MADV_REMOVE 9 /* Remove these pages and resources. */
# define MADV_DONTFORK 10 /* Do not inherit across fork. */
# define MADV_DOFORK 11 /* Do inherit across fork. */
# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
overrides the coredump filter bits. */
# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
# define MADV_HWPOISON 100 /* Poison a page for testing. */
#endif
/* The POSIX people had to invent similar names for the same things. */
#ifdef __USE_XOPEN2K
# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
#endif
Code: Alles auswählen
#PROT_EXEC = $4
locate mmap.so hat geschrieben:/usr/lib/x86_64-linux-gnu/argyll/libgammap.so
/usr/lib/x86_64-linux-gnu/argyll/libgammap.so.0
/usr/lib/x86_64-linux-gnu/argyll/libgammap.so.0.0.0
Re: SharedMemory mit mmap()
Hallo NicTheQuick,
Danke für deine ausführliche Antwort!
Jetzt weis ich zumindest wo ich reinschauen muss.
Hab wirklich vor das mal selber zu lernen, bzw. werde heute Abend mal versuchen aus deiner Info was zu machen. Wenn ich nicht zurecht komme melde ich mich.
Gruß, Micha122
PS: Das mit den Konstanten habe ich bereits jetzt schon begriffen.
Danke für deine ausführliche Antwort!
Jetzt weis ich zumindest wo ich reinschauen muss.
Hab wirklich vor das mal selber zu lernen, bzw. werde heute Abend mal versuchen aus deiner Info was zu machen. Wenn ich nicht zurecht komme melde ich mich.
Gruß, Micha122
PS: Das mit den Konstanten habe ich bereits jetzt schon begriffen.
Re: SharedMemory mit mmap()
Hätte wohl erwähnen müssen das ich OpenSuse 12.2 32bit verwende.
Also die Datei mman.h-Include habe ich im Verzeichnis /usr/include/bits gefunden. Stellt auch kein Problem dar daraus PB Konstanten zu machen, begreife sogar ich.
Die Datei /mman.h ist bei mir in /usr/include/sys. Sieht etwas komplizierter aus, aber sicher nicht unüberwindbar. Zum Glück sind es ja nicht so viele Befehle.
Was ich aber nicht finde ist die Library argyll/libgammap.so. Das Verzeichnis gibt es bei mir gar nicht und das Paket libc6-dev scheint es bei OpenSuse gar nicht zu geben. Das wichtigste um überhaupt mal richtig anfangen zu können fehlt mir also.
Vielleicht kennt sich hier ja jemand mit OpenSuse aus.
Gruß, Micha122
Also die Datei mman.h-Include habe ich im Verzeichnis /usr/include/bits gefunden. Stellt auch kein Problem dar daraus PB Konstanten zu machen, begreife sogar ich.
Die Datei /mman.h ist bei mir in /usr/include/sys. Sieht etwas komplizierter aus, aber sicher nicht unüberwindbar. Zum Glück sind es ja nicht so viele Befehle.
Was ich aber nicht finde ist die Library argyll/libgammap.so. Das Verzeichnis gibt es bei mir gar nicht und das Paket libc6-dev scheint es bei OpenSuse gar nicht zu geben. Das wichtigste um überhaupt mal richtig anfangen zu können fehlt mir also.
Vielleicht kennt sich hier ja jemand mit OpenSuse aus.
Gruß, Micha122
- 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()
Die Namen weichen leicht ab, aber Du wirst die entsprechenden Libs schon haben
Meine bisherigen Versuchen schlagen leider bei mmap fehl und mir fehlt die Zeit das
weiter zu untersuchen, vielleicht hat ja noch jemand Ideen. Hier der bisherige Code, der
noch nicht funktioniert!:
Vielleicht findet ja noch jemand das Problem, bzw. besser die Lösung
Gruß
Thomas
Meine bisherigen Versuchen schlagen leider bei mmap fehl und mir fehlt die Zeit das
weiter zu untersuchen, vielleicht hat ja noch jemand Ideen. Hier der bisherige Code, der
noch nicht funktioniert!:
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 = $100
#PROT_READ = $1
#PROT_WRITE = $2
#PROT_EXEC = $4
#MAP_SHARED = $1
ImportC "-lrt"
shm_open(name.p-Unicode, oflag, mode)
shm_unlink(name.p-Unicode)
EndImport
Global gSize.i, gName.s
Procedure Create(Name.s, Size.i)
Name = ReplaceString(Name, "/", "")
Name = "/" + Left(name, 254)
hMap = shm_open(name, #O_CREAT | #O_RDWR, 0)
If hMap
gSize = Size
gName = Name
ProcedureReturn mmap_(0, Size, #PROT_READ | #PROT_WRITE, #MAP_SHARED, hMap, 0)
EndIf
EndProcedure
Procedure Open(Name.s)
Name = ReplaceString(Name, "/", "")
Name = "/" + Left(name, 254)
hMap = shm_open(name, #O_RDWR, 0)
If hMap
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
Gruß
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()
ts-soft schrieb:
Die suche im Terminal "sudo find / -name libgammap.so" hat auf der Linux Platte 0 Treffer gebracht.
Dafür aber auf der Windows Partition. Erstaunlich was Windows alles speichert wenn man 2 Stunden googelt.
Danke für den Code! Hätte ich die Lib, würde ich gerne mal versuchen ein bisschen was damit zu basteln.
Gruß, Micha122
Ich denke auch das die Lib schon irgendwo ist, die Frage ist nur wo und unter welchem Namen.Die Namen weichen leicht ab, aber Du wirst die entsprechenden Libs schon haben
Die suche im Terminal "sudo find / -name libgammap.so" hat auf der Linux Platte 0 Treffer gebracht.
Dafür aber auf der Windows Partition. Erstaunlich was Windows alles speichert wenn man 2 Stunden googelt.
Danke für den Code! Hätte ich die Lib, würde ich gerne mal versuchen ein bisschen was damit zu basteln.
Gruß, Micha122
- 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()
Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.
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.
- 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()
Als kleiner Tipp. Installiere dir 'mlocate'. Dann machst du einmalig 'sudo updatedb' (dauert eine Weile) und dann kannst du mit 'locate libgammap.so' innerhalb von Sekunden die Datei auf deiner Platte finden. 'updatedb' erstellt einen Index vom Dateisystem, ist darin aber recht fix.Micha122 hat geschrieben:Ich denke auch das die Lib schon irgendwo ist, die Frage ist nur wo und unter welchem Namen.
Die suche im Terminal "sudo find / -name libgammap.so" hat auf der Linux Platte 0 Treffer gebracht.
Re: SharedMemory mit mmap()
@ts-soft
@NicTheQuick
Habe dann mal auf einer anderen HD Linux Mint Debian 32bit installiert. Also mlocate und libc6-dev sind da von Haus aus mit dabei.
Aber von deiner Lib leider auch unter Debian keine Spur!?
Gruß, Micha122
Habe natürlich gesehen, das du C Source einfügst. Findest du vielleicht die Lib auch nicht?Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.
@NicTheQuick
Also unter OpenSuse 12 und 13 keine Spur??Als kleiner Tipp. Installiere dir 'mlocate'. Dann machst du einmalig 'sudo updatedb' (dauert eine Weile) und dann kannst du mit 'locate libgammap.so' innerhalb von Sekunden die Datei auf deiner Platte finden. 'updatedb' erstellt einen Index vom Dateisystem, ist darin aber recht fix.
Habe dann mal auf einer anderen HD Linux Mint Debian 32bit installiert. Also mlocate und libc6-dev sind da von Haus aus mit dabei.
Aber von deiner Lib leider auch unter Debian keine Spur!?
Gruß, Micha122
- 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()
mmap_ kennt PB bereits als API und die anderen beiden Funktionen werden ImportiertMicha122 hat geschrieben:@ts-softHabe natürlich gesehen, das du C Source einfügst. Findest du vielleicht die Lib auch nicht?Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.
Code: Alles auswählen
ImportC "-lrt"
oder eine Umgebungsvariable. "-lrt" steht in der Manpage. Bei der Installation von weiteren Libs, werden diese mit dem
Programm: ldconfig aktualisiert, bzw. mit dem von SuSE verwendetem Aufruf.
C-Source hab ich auch nicht eingefügt, damit kann der PBCompiler doch nischt anfängen
Direkter Aufruf eine Lib mit Pfad ist keine gute Idee, es sei denn, die Lib gehört nicht zur Distribution und wird nur
von Deinem Programm benötigt.
Gruß
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.