Der Linux-Kernel (2.6) implementiert zwei Nachrichtenwarteschlangen: (eher 'Nachrichtenlisten', da die Implementierung über eine verknüpfte Liste erfolgt, die nicht strikt dem FIFO-Prinzip folgt.)
System V IPC-Nachrichten
Die Nachrichtenwarteschlange von System V.
Ein Prozess kann msgsnd()zum Senden einer Nachricht aufgerufen werden. Er muss die IPC-Kennung der empfangenden Nachrichtenwarteschlange, die Größe der Nachricht und eine Nachrichtenstruktur einschließlich Nachrichtentyp und Text übergeben.
Auf der anderen Seite ruft ein Prozess auf msgrcv(), um eine Nachricht zu empfangen, und übergibt die IPC-Kennung der Nachrichtenwarteschlange, in der die Nachricht gespeichert werden soll, die Größe und einen Wert t .
t gibt die von der Warteschlange zurückgegebene Nachricht an. Ein positiver Wert bedeutet, dass die erste Nachricht mit dem Typ t zurückgegeben wird. Ein negativer Wert gibt die letzte Nachricht mit dem Typ t zurück und null gibt die erste Nachricht der Warteschlange zurück.
Es gibt Einschränkungen hinsichtlich der Größe einer Nachricht (max), der Gesamtzahl der Nachrichten (mni) und der Gesamtgröße aller Nachrichten in der Warteschlange (mnb):
Die Ausgabe oben stammt von einem Ubuntu 10.10-System, die Standardeinstellungen sind in msg.h definiert .
Weitere Informationen zu unglaublich alten System V-Nachrichtenwarteschlangen finden Sie hier .
POSIX-Nachrichtenwarteschlange
Der POSIX-Standard definiert einen Nachrichtenwarteschlangenmechanismus, der auf der Nachrichtenwarteschlange von System V IPC basiert und diese um einige Funktionen erweitert:
Einfache dateibasierte Schnittstelle zur Anwendung
Unterstützung für Nachrichtenprioritäten
Unterstützung für asynchrone Benachrichtigung
Zeitüberschreitungen für das Blockieren von Vorgängen
util-linux stellt einige Programme zum Analysieren und Ändern von Nachrichtenwarteschlangen bereit, und die POSIX-Spezifikation enthält einige C-Beispiele:
Erstellen Sie eine Nachrichtenwarteschlange mit ipcmk; Im Allgemeinen würden Sie dies tun, indem Sie C-Funktionen wie ftok()und aufrufen msgget():
$ ipcmk -Q
Mal sehen, was passiert ist mit ipcsoder mit cat /proc/sysvipc/msg:
Antworten:
Der Linux-Kernel (2.6) implementiert zwei Nachrichtenwarteschlangen:
(eher 'Nachrichtenlisten', da die Implementierung über eine verknüpfte Liste erfolgt, die nicht strikt dem FIFO-Prinzip folgt.)
System V IPC-Nachrichten
Die Nachrichtenwarteschlange von System V.
Ein Prozess kann
msgsnd()
zum Senden einer Nachricht aufgerufen werden. Er muss die IPC-Kennung der empfangenden Nachrichtenwarteschlange, die Größe der Nachricht und eine Nachrichtenstruktur einschließlich Nachrichtentyp und Text übergeben.Auf der anderen Seite ruft ein Prozess auf
msgrcv()
, um eine Nachricht zu empfangen, und übergibt die IPC-Kennung der Nachrichtenwarteschlange, in der die Nachricht gespeichert werden soll, die Größe und einen Wert t .t gibt die von der Warteschlange zurückgegebene Nachricht an. Ein positiver Wert bedeutet, dass die erste Nachricht mit dem Typ t zurückgegeben wird. Ein negativer Wert gibt die letzte Nachricht mit dem Typ t zurück und null gibt die erste Nachricht der Warteschlange zurück.
Diese Funktionen sind in include / linux / msg.h definiert und in ipc / msg.c implementiert
Es gibt Einschränkungen hinsichtlich der Größe einer Nachricht (max), der Gesamtzahl der Nachrichten (mni) und der Gesamtgröße aller Nachrichten in der Warteschlange (mnb):
Die Ausgabe oben stammt von einem Ubuntu 10.10-System, die Standardeinstellungen sind in msg.h definiert .
Weitere Informationen zu unglaublich alten System V-Nachrichtenwarteschlangen finden Sie hier .
POSIX-Nachrichtenwarteschlange
Der POSIX-Standard definiert einen Nachrichtenwarteschlangenmechanismus, der auf der Nachrichtenwarteschlange von System V IPC basiert und diese um einige Funktionen erweitert:
Siehe ipc / mqueue.c
Beispiel
util-linux
stellt einige Programme zum Analysieren und Ändern von Nachrichtenwarteschlangen bereit, und die POSIX-Spezifikation enthält einige C-Beispiele:Erstellen Sie eine Nachrichtenwarteschlange mit
ipcmk
; Im Allgemeinen würden Sie dies tun, indem Sie C-Funktionen wieftok()
und aufrufenmsgget()
:Mal sehen, was passiert ist mit
ipcs
oder mitcat /proc/sysvipc/msg
:Füllen Sie nun die Warteschlange mit einigen Nachrichten:
Auch hier codieren Sie die msqid im Allgemeinen nicht fest im Code.
Und die andere Seite, die die Nachrichten erhalten wird:
Schau was passiert:
Nach zwei Empfängen ist die Warteschlange wieder leer.
Entfernen Sie es anschließend, indem Sie key (
-Q
) oder msqid (-q
) angeben :quelle