Aktuelle Zeit: 16.09.2019 00:11

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 13:17 
Offline

Registriert: 02.10.2011 14:45
Wohnort: Sinzig
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. :oops:

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. :cry:

Ein Beispiel wie ich SharedMemory damit verwirklichen könnte wäre super.

Gruß, Micha122


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 13:43 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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':
Code:
/* 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

So wird '#define PROT_EXEC 0x4' zum Beispiel zu
Code:
#PROT_EXEC = $4

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

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 13:56 
Offline

Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Hallo NicTheQuick,
Danke für deine ausführliche Antwort! :allright:
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. :allright:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 18:41 
Offline

Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Hätte wohl erwähnen müssen das ich OpenSuse 12.2 32bit verwende. :oops:

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. :D
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 19:18 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Die Namen weichen leicht ab, aber Du wirst die entsprechenden Libs schon haben :wink:
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:
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


Vielleicht findet ja noch jemand das Problem, bzw. besser die Lösung :wink:

Gruß
Thomas

_________________
PureBasic 5.71 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 20:02 
Offline

Registriert: 02.10.2011 14:45
Wohnort: Sinzig
ts-soft schrieb:
Zitat:
Die Namen weichen leicht ab, aber Du wirst die entsprechenden Libs schon haben :wink:


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.
Dafür aber auf der Windows Partition. Erstaunlich was Windows alles speichert wenn man 2 Stunden googelt. :shock:

Danke für den Code! Hätte ich die Lib, würde ich gerne mal versuchen ein bisschen was damit zu basteln.

Gruß, Micha122


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 20:07 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.

_________________
PureBasic 5.71 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 29.12.2013 21:45 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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.

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.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 30.12.2013 17:53 
Offline

Registriert: 02.10.2011 14:45
Wohnort: Sinzig
@ts-soft
Zitat:
Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.

Habe natürlich gesehen, das du C Source einfügst. :wink: Findest du vielleicht die Lib auch nicht?

@NicTheQuick
Zitat:
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.

Also unter OpenSuse 12 und 13 keine Spur??

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SharedMemory mit mmap()
BeitragVerfasst: 30.12.2013 18:25 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Micha122 hat geschrieben:
@ts-soft
Zitat:
Du brauchst keine weitere Lib, nur der Code enthält irgendwie noch einen Fehler.

Habe natürlich gesehen, das du C Source einfügst. :wink: Findest du vielleicht die Lib auch nicht?

mmap_ kennt PB bereits als API und die anderen beiden Funktionen werden Importiert
Code:
ImportC "-lrt"

Der genaue Name und Pfad ist hierfür nicht unbedingt erforderlich. Der linker findet das über /etc/ld.so.conf
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 :wink:

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.71 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye