Kommunikation via Message Queues

1. Was sind Queues?
Message Queues sind eine Möglichkeit, wie 2 Userlevel Prozesse miteinander komunizieren können. Man stellt sich das ganze am Besten wie ein langes Rohr vor, bei welchem man hinten Nachrichten reinsteckt und vorne welche rausholt. Im System gibt es eine gewisse Anzahl von diesen, welche über eine sog. queue_id adressiert werden. Selbige ID erhaelt man mittels msgget(2). Danach kann man mittels msgsnd(2) und msgrcv(2) Messages verschicken bzw. empfangen.
Damit hat man also die Möglichkeit, eine FIFO-Komunikation zwischen zwei User-Level Prozessen herzustellen. Der Sender schreibt einfach in die Queue, während der Leser immer ausliest.

2. Die Messages
Die Inhalt einer message ist jeweils ein struct, z.B:
struct message {
    long type;
    char text[BUFSIZE];
};
In der Wahl des Formats ist man frei, allerdings muss man darauf achten, dass der erste Eintrag immer ein long ist. Dieser wird nämlich als Type der Nachricht interpretiert. Näheres dazu kann der manpage zu msgsnd(2) entnommen werden.

3. Die Queue-Strukturen im Kernel
Den Aufbau im Kern beschreibt folgendes Bild:

Zu jeder Queue gibt es einen Queue-Header. In diesem liegen die Pointer auf den ersten und auf den letzten Nachrichten-Kopf. Jeder von diesen steht für eine Nachricht. Die Daten, die die Nachricht transportiert, liegen im Datenbereich.
Diesen kleinen Überblick soill uns vorerst genügen.

4. Der Zugriff auf die Queue-Strukturen vom Kernel aus
Das klingt ja alles ganz gut, hat aber einen kleine Hacken.
Der ganze Mechanismus liegt als Kernel-Modul vor, das bei Bedarf eingeladen wird. Leider haben die Entwickler bei Sun das ganze als reinen User-Level Kommunikations-Mechanismus konzipert, d.h. es ist nicht moeglich, von einem anderen Kernelmodul (nämlich unserem) auf die Queue-Strukturen zuzugreifen. Wir mussten also erst einiges an den Sourcen zu den Queues ändern und dann sogar den gesamten Kernel neu kompilieren. Damit ist es nicht mehr möglich, unsere Implementierung einfach auf einem anderen Rechner zu benutzen (Schade).