|
|
Gemeinsamer Speicher: Shared MemoryNormalerweise sind die Speicherbereiche zweier Prozesse streng getrennt. Der gemeinsame Speicher ermöglicht die Arbeit zweier Prozesse an den gleichen Daten. Neben den hier beschriebenen Prinzipien, sich den Speicher zu teilen, benötigen Sie normalerweise eine Form der Synchronisation, mit der die Prozesse sich darüber austauschen, wann wer auf den Speicher zugreifen darf.
Die Funktion
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int shmflg); Der Parameter key ist entweder eine Schlüsselzahl oder IPC_PRIVATE.
Der Parameter shmflg kann die Konstanten IPC_CREAT und IPC_EXCL und
neun Berechtigungsbits für den Eigner, die Gruppe und der Welt, aufnehmen.
Die Berechtigungen sind von
dem Befehl Der Rückgabewert ist -1 im Fehlerfall oder die Shared Memory ID, die für die nächsten Aufrufe benötigt wird.
Die Funktion
# include <sys/types.h> # include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmaddr);
Der Parameter shmid ist die von
Die Fehlermeldung von
myPtr = shmat(shID, 0, 0); if (myPtr==(char *)-1)
Mit der Funktion
#include <sys/ipc.h> #include <sys/shm.h> int shmctl(int shmid, int kommando, struct shmid_ds *buf); An den Parameter kommando können folgende Konstanten übergeben werden:
[Shared Memory Kontrollkommandos]L|L
Konstante & Bedeutung
Mit dem Kommandozeilenbefehl
Beispiel
Das Programm
[Shared Memory one.c] #include <sys/ipc.h> #include <sys/shm.h>
#define MAXMYMEM 30
int main(int argc, char **argv) { int shID; char *myPtr; int i;
/* Shared Memory erzeugen */ shID = shmget(2404, MAXMYMEM, IPC_CREAT | 0666); if (shID >= 0) { /* nun holen wir den Speicher */ myPtr = shmat(shID, 0, 0); if (myPtr==(char *)-1) { perror("shmat"); } else { /* Speicher ist zugreifbar: füllen! */ for (i=0; i<MAXMYMEM; i++) { myPtr[i] = 'A'+i; } getchar(); /* Warte mal auf eine Taste */ /* gebe den Speicher auf */ shmdt(myPtr); } } else { /* shmget lief schief */ perror("shmget"); } }
Das Programm
[Shared Memory two.c] #include <sys/ipc.h> #include <sys/shm.h> #define MAXMYMEM 30
int main(int argc, char **argv) { int shID; char *myPtr; int i;
/* Existierenden Shared Memory zugreifen */ shID = shmget(2404, MAXMYMEM, 0666); if (shID >= 0) { myPtr = shmat(shID, 0, 0); if (myPtr==(char *)-1) { perror("shmat"); } else { for (i=0; i<MAXMYMEM; i++) { putchar(myPtr[i]); } puts("n"); shmdt(myPtr); } } else { /* shmget lief schief */ perror("shmget"); } }
Die Programme brauchen keineswegs
parallel zu laufen. Man kann
[Shared Memory destroy.c] #include <sys/ipc.h> #include <sys/shm.h> #define MAXMYMEM 30
int main(int argc, char **argv) { int shID; char *myPtr; int i;
/* Shared Memory erzeugen */ shID = shmget(2404, MAXMYMEM, 0666); if (shID >= 0) { /* zerstöre den Shared Memory */ shmctl(shID, IPC_RMID, 0); } else { /* shmctl lief schief */ perror("shmctl"); } }
Ein interessantes Experiment zeigt das parallele Starten von
Bei dem Beispiel wird die Synchronisation der Programme durch den zeitlich
unterschiedlichen Start erreicht. Bei einem parallelen Start von
Der Shared Memory bleibt solange erhalten, bis ein Programm in explizit
entfernt (s. o.), bis zum nächsten Shutdown oder bis er mit dem Befehl
gaston> ipcs
--- Shared Memory Segments ---- key shmid owner perms Bytes nattch Status 0x00000964 425987 arnold 666 30 0
--- Semaphore Arrays ---- key semid owner perms nsems Status
--- Message Queues ---- key msqid owner perms used-bytes messages
gaston> ipcrm shm 425987 resource(s) deleted gaston>
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|