msgop(2) msgop(2)
NAME
msgop: msgsnd, msgrcv - Nachrichten senden/lesen
SYNTAX
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, sizet msgsz, int msgflg);
int msgrcv(int msqid, void *msgp, sizet msgsz, long msgtyp,
int msgflg);
BESCHREIBUNG
msgsnd() wird zum Senden einer Nachricht an die Warteschlange verwen-
det, die durch die Kennung msqid angegeben ist. msgp zeigt auf einen
benutzerdefinierten Puffer, der als erstes ein Feld des Typs long
integer enthalten muß, das den Typ der Meldung angibt, und dann einen
Datenteil, der den Text der Meldung enthält. Folgende Elemente können
Teil eines benutzerdefinierten Puffers sein:
long int mtype; /* Nachrichtentyp */
char mtext[1]; /* Nachrichtentext */
mtype ist eine positive ganze Zahl, die vom empfangenden Prozeß für
die Nachrichtenauswahl verwendet werden kann. mtext ist ein beliebiger
Text mit der Länge von msgsz Byte. msgsz kann von 0 bis zu einem
systembedingten Maximum reichen.
msgflg gibt die zu treffenden Maßnahmen an, wenn einer oder mehrere
der nachstehenden Punkte zutreffen:
- Die Anzahl der sich bereits in der Warteschlange befindenden Bytes
ist gleich msgqbytes.
- Die Gesamtanzahl der Nachrichten in allen Warteschlangen im Gesamt-
system ist gleich dem systembedingten Grenzwert.
Diese Maßnahmen lauten wie folgt:
⊕ Wenn (msgflg&IPCNOWAIT) wahr ist, wird die Nachricht nicht gesen-
det, und der Aufruf kehrt sofort zurück.
⊕ Wenn (msgflg&IPCNOWAIT) nicht wahr ist, wird die Ausführung des
aufrufenden Prozesses angehalten, bis einer der folgenden Punkte
eintritt:
- Besteht die für das Anhalten verantwortliche Bedingung nicht
mehr, wird die Nachricht gesendet.
- msqid wird vom System entfernt [siehe msgctl(2)]. Wenn dieses
eintritt, wird errno auf EIDRM gesetzt, und -1 wird zurückgege-
ben.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
msgop(2) msgop(2)
- Der aufrufende Prozeß erhält ein Signal, das abgefangen werden
soll. In diesem Fall wird die Nachricht nicht gesendet, und der
aufrufende Prozeß nimmt die Ausführung in der in signal(2)
beschriebenen Weise wieder auf.
msgsnd() ist erfolglos, und eine Nachricht wird nicht gesendet, wenn
einer oder mehrere der nachstehenden Punkte zutreffen:
EINVAL msqid ist keine gültige Kennung für die Nachrichten-Warte-
schlange.
EACCES Dem aufrufenden Prozeß wird die Zugriffserlaubnis verwei-
gert.
EINVAL mtype ist kleiner als 1.
EAGAIN Die Nachricht kann aus einem der oben angegebenen Gründe
nicht gesendet werden, und (msgflg&IPCNOWAIT) ist wahr.
EINVAL msgsz ist kleiner als 0 oder größer als der systembedingte
Grenzwert.
EFAULT weist auf eine unzulässige Adresse.
Nach erfolgreicher Beendigung werden nachstehende Maßnahmen hinsicht-
lich der zu msqid gehörenden Datenstruktur ausgeführt.
- msgqnum wird um 1 erhöht.
- msglspid wird auf die Prozeßnummer des aufrufenden Prozesses
gesetzt.
- msgstime wird auf die aktuelle Uhrzeit gesetzt.
msgrcv() liest eine Nachricht aus der Warteschlange, die der Kennung
der Nachrichten-Warteschlange msqid gehört und schreibt sie in die
benutzerdefinierte Struktur, auf die msgp zeigt. Die Struktur muß ein
Feld für den Nachrichtentyp, gefolgt von einem Bereich für den Nach-
richtentext, enthalten (siehe die Struktur mymsg oben). mtype ist der
Typ der empfangenen Nachricht, wie vom sendenden Prozeß angegeben.
mtext ist der Nachrichtentext. msgsz gibt die Größe von mtext in Bytes
an. Die empfangene Nachricht wird auf msgsz Bytes verkürzt, wenn sie
größer als msgsz ist und (msgflg&MSGNOERROR) wahr ist. Der abge-
schnittene Teil der Nachricht geht verloren; der aufrufende Prozeß
wird über die Verkürzung der Nachricht nicht benachrichtigt.
msgtyp gibt den Typ der angeforderten Nachricht wie folgt an:
- Wenn msgtyp 0 ist, wird die erste Nachricht der Warteschlange emp-
fangen.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
msgop(2) msgop(2)
- Wenn msgtyp größer als 0 ist, wird die erste Nachricht des Typs
msgtyp empfangen.
- Wenn msgtyp kleiner als 0 ist, wird die erste Nachricht des nie-
drigsten Typs empfangen, der kleiner als oder gleich dem absoluten
Wert von msgtyp ist.
msgflg gibt die zu treffenden Maßnahmen an, wenn eine Nachricht des
gewünschten Typs nicht in der Warteschlange ist. Hierbei handelt es
sich um folgendes:
⊕ Wenn (msgflg&IPCNOWAIT) wahr ist, kehrt der aufrufende Prozeß
sofort mit dem Rückgabewert -1 zurück und setzt errno auf ENOMSG.
⊕ Wenn (msgflg&IPCNOWAIT) nicht wahr ist, wird der aufrufende Prozeß
angehalten, bis eine der folgenden Situationen auftritt:
- Eine Nachricht des gewünschten Typs wird in die Warteschlange
gesetzt.
- msqid wird vom System entfernt. Wenn dies geschieht, wird errno
auf EIDRM gesetzt, und -1 wird zurückgegeben.
- Der aufrufende Prozeß empfängt ein Signal, das abgefangen werden
soll. In diesem Fall wird keine Nachricht empfangen, und der
aufrufende Prozeß nimmt die Ausführung in der in signal(2)
beschriebenen Weise wieder auf.
msgrcv() ist erfolglos und empfängt keine Nachricht, wenn einer oder
mehrere der nachstehenden Punkte zutreffen:
EINVAL msqid ist keine gültige Kennung für die Nachrichten-
Warteschlange.
EACCES Dem aufrufenden Prozeß wird die Zugriffserlaubnis verwei-
gert.
EINVAL msgsz ist kleiner als 0.
E2BIG Die Länge von mtext ist größer als msgsz und
(msgflg&MSGNOERROR) ist nicht wahr.
ENOMSG Die Warteschlange enthält keine Nachricht des gewünschten
Typs, und (msgflg&IPCNOWAIT) ist wahr.
EFAULT msgp weist auf eine unzulässige Adresse.
Nach erfolgreicher Beendigung werden folgende Maßnahmen in Hinblick
auf die zu msqid gehörende Datenstruktur ausgeführt:
- msgqnum wird um 1 verringert.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
msgop(2) msgop(2)
- msglrpid wird auf die Prozeßnummer des aufrufenden Prozesses
gesetzt.
- msgrtime wird auf die aktuelle Zeit gesetzt.
ERGEBNIS
Wenn msgsnd() oder msgrcv() aufgrund des Empfangs eines Signals
zurückkehren, wird -1 an den aufrufenden Prozeß zurückgegeben, und
errno wird auf EINTR gesetzt. Kehren sie zurück, weil die Kennung
msqid entfernt wurde, wird -1 zurückgegeben, und errno wird auf EIDRM
gesetzt.
Nach erfolgreicher Beendigung ist der Rückgabewert wie folgt:
- msgsnd() gibt 0 zurück.
- msgrcv() gibt die Anzahl der Bytes zurück, die tatsächlich nach
mtext geschrieben wurden.
Andernfalls wird -1 zurückgegeben, und errno wird zur Anzeige des Feh-
lers gesetzt.
SIEHE AUCH
msgctl(2), msgget(2), signal(2).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98