C-Programmierung

POSIX Shared Memory mit C-Programmierung

POSIX Shared Memory mit C-Programmierung
POSIX Shared Memory ist ein Framework für die Interprozesskommunikation (IPC), das in den POSIX-Spezifikationen spezifiziert ist. Zwei (oder mehr) Tasks können daraus lesen und in die Shared Memory Zone schreiben, während sie den Shared Memory aufbauen. POSIX Shared Memory erzwingt im Gegensatz zu anderen IPC-Strukturen (z.G., Rohr, Muffe usw.) und ist für bestimmte Programme wünschenswert.

POSIX Shared Memory-Aufrufe

Die Shared-Memory-Funktionen von POSIX konzentrierten sich auf das UNIX-Konzept, dass das Objekt ein Dokument sein muss, wenn Eingabe-/Ausgabeaktivitäten an einer Entität ausgeführt werden. Da Sie also eine gemeinsame POSIX-Speichereinheit rezitieren und einschreiben, muss diese als Dokument betrachtet werden. Ein speicherabgebildetes Dokument ist eine POSIX-Einheit mit gemeinsam genutztem Speicher. Um die zu verwenden shm_open Systemaufruffunktion unten /dev/shm, separate Shared-Memory-Dokumente werden generiert. Es gibt nur zwei dedizierte Shared-Memory-Systemaufrufe von POSIX, shm_open, und shm_unlink, die eng mit dem Öffnen und Trennen von Dateisystemaufrufen zusammenhängen. Das ftruncate, mmap, und munmap Framework-Aufrufe für Dokumente werden verwendet, um andere Aufgaben im gemeinsam genutzten POSIX-Speicher auszuführen. Es ist notwendig, ein Programm, das POSIX-Shared-Memory-Aufrufe verwendet, mit -lrt.

Programme, die POSIX Shared Memory-Aufrufe verwenden, müssen die folgenden Schritte durchlaufen:

Verwenden von shm_open(), bilden ein Shared-Memory-Objekt. Der Dokumentdeskriptor kann zurückgesetzt werden, wenn die Bildung des Objekts erfolgreich ist.

Mit ftruncate(), die Größe des Objekts wird festgelegt.

Mit Karte() und MAP_SHARED, dieses Objekt in den gegenwärtigen Adressraum eingrenzen.

Lesen/Schreiben des gemeinsamen Speichers.

Über munmap(), den gemeinsamen Speicher aufheben.

Benutzen schließen() das Objekt schließen.

Durch shm_unlink(), lösche das Objekt im Shared Memory.

shm_open()

Wie oben beschrieben, shm_open() wird verwendet, um ein neues Shared-Memory-Objekt zu generieren. Es macht das Objekt für die aufrufende Prozedur zugänglich, indem es den umgekehrten Deskriptor verwendet. Folgendes ist die Definition dieses Funktionsaufrufs:

>> Int shm_open( const char *name, int oflag, mode_t mode);

Der erste Parameter ist der Name des Shared-Memory-Objekts. Es ist eine nullterminierte Zeichenfolge der /Name Typ, mit der Bedingung, dass kein anderes Zeichen als das erste Zeichen ein Schrägstrich sein darf. Oflag ist ein kleiner Schleier, der mit mehreren der vorhergehenden Flags durch ODER-Verknüpfung erstellt wurde, egal ob via O_RDONLY oder O_RDWR. Die beschriebenen Parameter geben an, dass sein Shared-Memory-Objekt gebildet werden muss (O_CREAT), wenn es noch nicht existiert und das Objekt auch zum Lesen und Schreiben verfügbar ist (O_RDWR). Das allerletzte Argument legt die Verzeichnisfreigaben für das Shared-Memory-Objekt fest.

shm_unlink()

Shm_unlink() eliminiert die zuvor entwickelte POSIX Shared Memory Entität. Der ganzzahlige Dokumentdeskriptor für das Shared-Memory-Objekt wird über einen effektiven Aufruf von . zurückgegeben shm_open(). Wie unter dem definiert shm_open(), der Parametername ist der Titel der gemeinsam genutzten Speichereinheit. Das Folgende ist die Definition von shm_unlink() Funktion:

>> Int shm_unlink( const char *name);

ftruncate()

Beim Einstellen des Objekts wird die ftruncate() -Methode wird abgeworfen, um die Entitätsgröße in Bytes festzulegen. Die Funktionsdefinition lautet wie folgt:

>> Int ftruncate( int fd, off_t Länge);

Beim Aufbau eines gemeinsam genutzten POSIX-Speichers hat er tatsächlich eine Größenkapazität von null Byte. Sie können die POSIX-Shared-Memory-Entität mit Bytes der Größe Länge rendern über ftruncate. Ftruncate ergibt null bei der Ausführung. Ftruncate Ausgänge -1 im Fehlerfall und Fehler ist so eingestellt, dass der Fehler ausgelöst wird.

mmap()

Schließlich wird ein speicherabgebildetes Dokument mit der Shared-Memory-Entität über die mmap() Methode. Dann ergibt es einen speicherabgebildeten Dokumentzeiger, der abgeworfen wird, um die Einheit mit gemeinsam genutztem Speicher zu erreichen. Das Folgende ist die Definition von mmap() Funktion:

>> Void *mmap ( void *addr, size_t length, int prot, int flags, int fd, off_t offset);

Dabei ist 'adr' die Adresse, auf die es abgebildet wird. Die 'Länge' ist der Bereich der gemeinsam genutzten Speichereinheit. Die Werte für prot können abweichen, aber wir verwenden das PROT READ | SCHUTZSCHREIBEN. Es gibt mehrere Flags, aber MAP SHARED ist für den gemeinsamen Speicher unerlässlich. 'fd' ist nun ein Dokumentdeskriptor, der früher erhalten wurde. Offset ist der Punkt, an dem die Abbildung in der gemeinsam genutzten Speichereinheit beginnt; der 0-Offset-Wert kann auch verwendet werden. Bei Fertigstellung, mmap() liefert den Zeiger auf die Abbildungsposition der gemeinsam genutzten Speichereinheit.

munmap()

An der Position, die von der Adresse geleitet wird und Größe, Länge erhält, munmap hebt die Zuordnung des Shared-Memory-Elements auf. Munmap ergibt 0 bei Abschluss und -1 bei Ungenauigkeit, in diesem Fall wird errno zugewiesen, um den Fehler auszulösen.

>> Void munmap ( void *addr, size_t length);

Beispiel: Sender und Empfänger

Nehmen wir das Beispiel des Senders und des Empfängers. Der Absender erstellt ein neues Shared-Memory-Objekt mit dem Namen /shmem-Beispiel und schreiben Sie damit drei Ziffern in den gemeinsamen Speicher ein. Jetzt kann der Empfänger das Shared-Memory-Objekt freigeben und die drei Ziffern aus dem Speicher aufsagen. Wir werden drei Dateien mit den Namen erstellen Protokoll.h, Absender.c, und Empfänger.c.

$ Touch-Protokoll.ha
$ Absender berühren.c
$ Empfänger berühren.c

Als nächstes fügen wir den folgenden Quellcode zu den Dateien 'Protokoll' hinzu.h,"Absender.c“ und „Empfänger“.c.' Jetzt werden wir alle speichern und schließen.

Jetzt werden wir den obigen Code mit dem Schlüsselwort -lrt separat für den Absender kompilieren und zusammenfügen.c und Empfänger.c-Datei. Hier ist der Befehl dazu:

$ gcc -o Absender Absender.c -lrt
$ gcc -o Empfängerempfänger.c -lrt

Jetzt führen wir den Absendercode mit dem folgenden Befehl aus. Die Ausgabe ist unten angegeben.

$ ./Absender

Durch Ausführen des Absendercodes wurde das Shared-Memory-Objekt generiert und ist unten zu finden /dev/shm mit dem folgenden Befehl:

$ ls -l /dev/shm | grep shmem-Beispiel

Wenn wir den Empfängercode ausführen, erhalten wir die folgende Ausgabe:

$ ./Empfänger

Immer wenn die Funktion gm_unlink() wird mit der Datei 'receiver . aufgerufen.c,' das Objekt /dev/shm/shmem-Beispiel wird abgelöst. In diesem Fall erhalten Sie bei der Ausgabe kein Objekt, wie unten gezeigt.

$ ls -l /dev/shm/shmem-Beispiel

Fazit

In diesem Artikel haben Sie gelernt, wie Sie POSIX Shared Memory mit C-Programmierung in Ubuntu 20 verwenden.04, einschließlich aller Funktionsaufrufe, die verwendet werden, um gemeinsam genutzten Speicher einzurichten. Ich hoffe, dass dieser Artikel Ihnen geholfen hat, Ihre Programmierkenntnisse zu verbessern und alle Zweifel ausgeräumt hat, die Sie zu diesem Thema haben.

Top Oculus App Lab-Spiele
Wenn Sie Besitzer eines Oculus-Headsets sind, müssen Sie über Sideloading informiert sein. Sideloading ist der Prozess der Installation von Inhalten, ...
Top 10 Spiele zum Spielen auf Ubuntu
Die Windows-Plattform war eine der dominierenden Plattformen für Spiele aufgrund des großen Prozentsatzes von Spielen, die heute entwickelt werden, um...
Die 5 besten Arcade-Spiele für Linux
Heutzutage sind Computer ernsthafte Maschinen, die zum Spielen verwendet werden. Wenn du den neuen Highscore nicht bekommst, weißt du was ich meine. I...