Shared_Memory
Shared Memory Modul
Übersicht und Zweck
Das Verzeichnis shared_memory
stellt ein Modul bereit, das die Verwaltung von gemeinsam genutztem Speicher (Shared Memory) in einem Mehrprozess-System ermöglicht. Dieses Modul ist insbesondere für die Speicherung und Verwaltung von Spiel- und Spielerinformationen konzipiert. Die enthaltenen Dateien sind:
- shared_memory.c: Diese Datei implementiert die grundlegenden Operationen zur Verwaltung von Shared Memory, wie die Erstellung, Anbindung, Loslösung, und Entfernung von Shared Memory Segmenten.
- shared_memory.h: Die Header-Datei definiert die Schnittstelle für die in
shared_memory.c
enthaltenen Funktionen und enthält die notwendigen Deklarationen und Definitionen. - README.md: Diese Datei liefert eine Übersicht über die Funktionalitäten des Moduls und beschreibt die Nutzung und Abhängigkeiten.
Wichtige Funktionen
1. createSharedMemory(int numPlayers)
- Zweck: Erstellt ein Shared Memory Segment für eine definierte Anzahl von Spielern.
- Eingabeparameter:
int numPlayers
: Die Anzahl der Spieler, für die Speicher reserviert werden soll. Muss zwischen 1 undMAX_PLAYERS_TEST
(100) liegen.
- Rückgabewerte:
- Liefert die ID des erstellten Shared Memory Segments bei Erfolg.
- Gibt einen negativen Fehlercode (
SHM_ERROR_CREATION
) bei Fehlschlag zurück.
- Besondere Hinweise: Stellt sicher, dass die Spieleranzahl innerhalb der gültigen Grenzen liegt, bevor Speicher allokiert wird.
2. attachSharedMemory(int shmid)
- Zweck: Bindet ein Shared Memory Segment an den aktuellen Prozess.
- Eingabeparameter:
int shmid
: Die ID des Shared Memory Segments, das angebunden werden soll.
- Rückgabewerte:
- Gibt einen Zeiger auf das Shared Memory Segment bei Erfolg zurück.
- Gibt
NULL
bei Fehlschlag zurück.
- Besondere Hinweise: Funktioniert nicht, wenn die Segment-ID ungültig ist oder das Segment nicht existiert.
3. detachSharedMemory(SharedMemory *shm)
- Zweck: Trennt ein Shared Memory Segment vom aktuellen Prozess.
- Eingabeparameter:
SharedMemory *shm
: Ein Zeiger auf das Shared Memory Segment, das getrennt werden soll.
- Rückgabewerte:
- Gibt
SHM_SUCCESS
bei Erfolg zurück. - Gibt einen negativen Fehlercode (
SHM_ERROR_DETACH
) bei Fehlschlag zurück.
- Gibt
- Besondere Hinweise: Der Zeiger darf nicht
NULL
sein, andernfalls tritt ein Fehler auf.
Schnittstellen
Die Dateien interagieren miteinander durch die Verwendung der Header-Datei shared_memory.h
, die alle notwendigen Deklarationen und Definitionen bereitstellt. Diese Datei enthält Definitionen wichtiger Strukturen wie SharedMemory
und Player
, sowie Konstanten und Fehlercodes, die bei der Verwaltung von Shared Memory verwendet werden.
- Globale Variablen und Konfigurationen:
MAX_PLAYERS_TEST
: Definiert die maximale Anzahl an Spielern, die im Shared Memory gespeichert werden können.SHM_PERMISSIONS
: Setzt die Berechtigungen für Shared Memory Segmente.INITIAL_SIZE
: Gibt die anfängliche Größe für spielbezogene Daten im Shared Memory an.
Implementierungsdetails
Datenstrukturen
Player
Struktur: Speichert Informationen zu einzelnen Spielern, einschließlich ihrer Nummer, Namen, und Registrierungsstatus.SharedMemory
Struktur: Speichert allgemeine Spieleinformationen und eine dynamische Liste von Spielern. Die Struktur enthält auch Prozess-IDs für spezifische Rollen im Spielmanagement.shm_data_t
Struktur: Wird verwendet, um Spielzustandsdaten zu speichern. Diese Struktur enthält ein Flag, das anzeigt, ob eine neue Spielaktion berechnet werden muss.
Implementierung
- Shared Memory Management: Die Implementierung verwendet Systemaufrufe wie
shmget
,shmat
,shmdt
, um Speichersegmente zu erstellen, anzubinden, zu trennen und zu entfernen. Diese Operationen basieren auf den standardisierten Schnittstellen vonsys/shm.h
.
Beispielaufrufe
Erstellen und Anbinden von Shared Memory
int shmid = createSharedMemory(10);
if (shmid < 0) {
// Fehlerbehandlung
}
SharedMemory *shm = attachSharedMemory(shmid);
if (shm == NULL) {
// Fehlerbehandlung
}
Loslösung und Entfernung von Shared Memory
if (detachSharedMemory(shm) != SHM_SUCCESS) {
// Fehlerbehandlung
}
// Entfernen eines Shared Memory Segments
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
// Fehlerbehandlung
}
Diese Beispiele zeigen die grundlegende Nutzung der Hauptfunktionen des Moduls. Entwickler sollten sicherstellen, dass sie entsprechende Fehlerprüfungen und Ressourcenfreigaben implementieren, um Speicherlecks und andere Probleme zu vermeiden.