Ich habe ein Problem mit einem meiner Projekte.
Ich habe versucht, ein gut dokumentiertes Beispiel für die Verwendung von Shared Memory zu finden, fork()
aber ohne Erfolg.
Grundsätzlich ist das Szenario ist , dass , wenn der Benutzer das Programm startet, muss ich im gemeinsam genutzten Speicher zwei Werte speichern: current_path die einen ist char * und ein datei_name die auch char * .
In Abhängigkeit von den Befehlsargumenten, wird ein neuer Prozess beginnt mit fork()
und dieser Prozess lesen muss und ändern Sie die current_path Variable im gemeinsam genutzten Speicher gespeichert , während die datei_name Variable nur gelesen wird.
Gibt es ein gutes Tutorial zum gemeinsamen Speicher mit Beispielcode (falls möglich), zu dem Sie mich weiterleiten können?
quelle
shmget()
et al. und auch der reinemmap()
Ansatz mitMAP_ANON
(akaMAP_ANONYMOUS
) - obwohlMAP_ANON
nicht von POSIX definiert. Es gibt auch POSIXshm_open()
undshm_close()
zum Verwalten von gemeinsam genutzten Speicherobjekten. [… Fortsetzung…]shm_unlink()
), wohingegen Mechanismen,mmap()
die eine Datei verwenden , eine Datei erfordern undMAP_SHARED
bestehen bleiben die Daten (undMAP_ANON
schließt die Persistenz aus). Es gibt ein vollständiges Beispiel im Abschnitt "Begründung" der Spezifikation vonshm_open()
.Antworten:
Es gibt zwei Ansätze:
shmget
undmmap
. Ich werde darüber sprechenmmap
, da es moderner und flexibler ist, aber Sie können sichman shmget
( oder dieses Tutorial ) ansehen, wenn Sie lieber die Tools im alten Stil verwenden möchten.Die
mmap()
Funktion kann verwendet werden, um Speicherpuffer mit hochgradig anpassbaren Parametern zuzuweisen, um den Zugriff und die Berechtigungen zu steuern, und sie bei Bedarf mit Dateisystemspeicher zu sichern.Die folgende Funktion erstellt einen speicherinternen Puffer, den ein Prozess für seine untergeordneten Elemente freigeben kann:
Das folgende Beispielprogramm verwendet die oben definierte Funktion, um einen Puffer zuzuweisen. Der übergeordnete Prozess schreibt eine Nachricht, gabelt und wartet dann darauf, dass sein untergeordnetes Element den Puffer ändert. Beide Prozesse können den gemeinsam genutzten Speicher lesen und schreiben.
quelle
shmget
ist eine wirklich altmodische und einige würden sagen veraltete Art und Weise, Shared Memory zu machen ... Besser zu verwendenmmap
undshm_open
, einfache Dateien oder einfachMAP_ANONYMOUS
.Hier ist ein Beispiel für Shared Memory:
Schritte :
Verwenden Sie ftok, um einen Pfadnamen und eine Projektkennung in einen System V IPC-Schlüssel zu konvertieren
Verwenden Sie shmget, das ein gemeinsam genutztes Speichersegment zuweist
Verwenden Sie shmat, um das von shmid identifizierte gemeinsam genutzte Speichersegment an den Adressraum des aufrufenden Prozesses anzuhängen
Führen Sie die Operationen im Speicherbereich aus
Mit shmdt abnehmen
quelle
Diese sind für die Verwendung von Shared Memory enthalten
quelle
Probieren Sie dieses Codebeispiel aus, ich habe es getestet, Quelle: http://www.makelinux.net/alp/035
quelle
shmget
undshmat
aus einem anderen Verfahren), die Art des ganzen Punktes des gemeinsam genutzten Speichers ist ... = (Hier ist ein mmap-Beispiel:
quelle
open
Fügt Datei-E / A-Overhead hinzu. Verwenden Sieshm_open
stattdessen.