In diesem Thread wird die Verwendung des OP vorgeschlagen mmap()
Anstatt von shmget()
Shared Memory unter Linux zu erhalten. ich besuchte Dies Seite und Dies Seite, um etwas Dokumentation zu erhalten, aber die zweite gibt ein obskures Beispiel bzgl mmap()
.
Da ich fast ein Neuling bin und einige Informationen (in Textform) zwischen zwei Prozessen austauschen muss, sollte ich die verwenden shmget()
Methode bzw mmap()
? Und warum?
Beide Methoden sind praktikabel. mmap
Methode ist dann etwas restriktiver shmget
aber einfacher zu bedienen. shmget
ist das alte Shared-Memory-Modell von System V und hat die breiteste Unterstützung. mmap
/shm_open
ist die neue POSIX-Methode, um gemeinsam genutzten Speicher zu verwenden, und ist einfacher zu verwenden. Wenn Ihr Betriebssystem die Verwendung von POSIX-Shared-Memory zulässt, würde ich vorschlagen, dies zu tun.
Einige Hinweise:
- Wenn Sie Ihre Kinder über erstellen
fork
dann mmap
mit MAP_ANONYMOUS | MAP_SHARED
ist bei weitem der einfachste Weg – nur ein Anruf. MAP_ANONYMOUS
ist jedoch eine Linux-Erweiterung nicht von POSIX angegeben.
- Wenn Sie die Prozesse selbstständig starten, können Sie diese dann aber mit einem Shared-Memory-Namen versorgen
shm_open
(+ ftruncate
) + mmap
mit MAP_SHARED
ist zwei/drei Anrufe. Erfordert librt
auf einigen Betriebssystemen.
- Wenn Ihr Betriebssystem hat
/dev/shm/
dann shm_open
entspricht dem Öffnen einer Datei in /dev/shm/
.
Vieles davon hat mit Geschichte und zukünftigen Richtungen zu tun.
Es waren einmal zwei Hauptversionen (und etwas konkurrierende) von Unix – System V und BSD. SysV hatte seine eigenen Versionen von IPC, einschließlich der großen 3 – gemeinsam genutzter Speicher, Semaphore und Nachrichtenwarteschlangen. POSIX kam daher, um zu versuchen, Dinge zu vereinen.
Derzeit haben wir also zwei Versionen – Posix Shared Memory, MQs und Semaphore und die sysV-Versionen. Nur um die Dinge etwas verwirrender zu machen, sind die sysV-Versionen Auch Teil von Posix.
Ihre Frage ist also, ob Sie gemeinsam genutzten Speicher im Posix- oder SysV-Stil verwenden möchten? Im Allgemeinen nehmen die meisten Menschen die langfristige Perspektive und entscheiden sich für Posix, weil dies der Weg in die Zukunft zu sein scheint. Aber realistischerweise ist sysV-Zeug so in so viele Systeme eingebettet, dass Sie ernsthaft bezweifeln müssen, dass es jemals verschwinden wird.
Wenn Sie also die langfristigen Dinge eliminieren, kommt es darauf an, was für Ihr Projekt und Ihren Geschmack sinnvoll ist. Im Allgemeinen sind die sysV-Versionen tatsächlich etwas leistungsfähiger, aber sie haben eine klobige Oberfläche, die die meisten Leute beim ersten Kontakt etwas verwirrend finden. Dies gilt insbesondere für sysV-Semaphore und Nachrichtenwarteschlangen. In Bezug auf gemeinsam genutzten Speicher kann argumentiert werden, dass sowohl sysV als auch posix umständlich sind. Die sysV-Versionen tragen das klobige ftok
und wichtige Dinge, während die Posix am Ende mehrere Anrufe und einige Rennbedingungen zum Einrichten entgegennimmt. Von außen haben die Posix-Versionen den Vorteil, dass sie das Dateisystem nutzen und mit Standard-Befehlszeilenfunktionen wie ‘rm’ gewartet werden können, anstatt sich auf separate Hilfsprogramme (z ipcs
), die sysV benötigt.
Welche sollten Sie also verwenden? In der Regel sind die posix-Versionen. Aber Sie sollten sich wirklich mit sysV-Versionen vertraut machen. Sie haben einige Funktionen, die über die Möglichkeiten der Posix-Versionen hinausgehen, die Sie in bestimmten Situationen möglicherweise nutzen möchten.