| Axel Rogat |
| Betriebssysteme und betriebssystemnahes Programmieren |
|   |
9.2: IPC-Mechanismen
| Kapitel 9 |
9.4: Semaphore  
|
|   |
|   | 9.3 Message Queues |   |
|   |
Es gibt eine Möglichkeit zur indirekten IPC über den Austausch von
Nachrichten per Mailbox, die sogenannte Message Queue, die von beliebig
vielen Prozessen aus erreichbar ist. Alles, was mit den Message-Operationen
möglich ist, läßt sich auch über FIFOs realisieren.
Programme werden aber oft übersichtlicher als eine gleichwertige
FIFO-Version.
Strukturen, Konstanten und Aufrufe sind in sys/ipc.h und
sys/msg.h definiert. Die Nachrichten haben auf Benutzer-Ebene folgenden
Aufbau:
Es gibt folgenden Satz von Systemaufrufen zu Messages:
Beispiel: Wir formulieren unser Client-Server-Beispiel aus dem
FIFO-Abschnitt für Message Queues um. Wenn
wir schon eine Message-Struktur verschicken, arbeiten wir diesmal direkt mit
binären Daten.
Wir brauchen nur eine Queue überhaupt. Die Messages enthalten ein
Feld mit der PID der Clients, und die Clients sind so nett und holen sich
nur Nachrichten ab, die für sie bestimmt sind. Zusätzlich
benötigen wir aber ein Kommunikations-File, in dem der Server den
Schlüssel der Queue ablegt, die er angelegt hat.
Unsere genaue Message-Struktur und den Namen des Files definieren wir in
einer gemeinsamen Header-Datei divq.h:
UNIX
int msgget(key_t key, int flg);
get message queue, erfragt die ID einer bestehenden Message-Queue
oder legt eine neue an (siehe 9.2)
int msgctl(int qid, int cmd, struct msqid_ds *buf);
message queue control, dient zum direkten Auslesen oder Einschreiben
von Teilen der Message-Queue-Struktur.
Am wichtigsten ist das Kommando cmd=IPC_RMID zum Löschen der
Queue.
int msgsnd(int qid, struct msgbuf *p, int sz, int flg);
message send, sendet eine Nachricht an die durch qid
bezeichnete Queue. mp zeigt auf die Daten, sz gibt die
tatsächliche Länge an, flg steuert das Verhalten
übergroßer Nachrichten. Wenn die Queue voll ist, blockiert der
Aufruf, bis sie verkleinert, gelöscht oder der Prozeß unterbrochen
wird.
int msgrcv(int qid, struct msgbuf *mp, int sz, long typ, int flg);
message receive, holt eine Nachricht aus der Queue qid ab
(sie wird aus der Queue entfernt).
Es wird folgende Message abgeholt:
 
9.2: IPC-Mechanismen
Startseite
9.4: Semaphore