Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

msgrcv - Nachricht aus Warteschlange empfangen

&pagelevel(4)&pagelevel

Definition

#include <sys/msg.h>

int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg);

Beschreibung

msgrcv() liest eine Nachricht aus der Warteschlange, der die durch msqid angegebene Warteschlangenkennzahl zugeordnet ist, und legt diese in dem vom Benutzer definierten Puffer ab, auf den msgp zeigt.

msgp zeigt auf einen vom Benutzer definierten Puffer, der zunächst eine Komponente des Typs long int für den Nachrichtentyp und dann einen Datenbereich für die Datenbytes der Nachricht enthalten muss. Die nachstehende Struktur ist ein Beispiel dafür, wie dieser vom Benutzer definierte Puffer aussehen könnte:

struct mymsg
{
   long int mtype;       /* Nachrichtentyp  */ 
   char mtext[1];        /* Nachrichtentext */ 
} 

Die Strukturkomponente mtype ist der Nachrichtentyp der empfangenen Nachricht, wie durch den sendenden Prozess angegeben.

Die Strukturkomponente mtext ist der Nachrichtentext.

msgsz gibt die Größe von mtext in Bytes an. Wenn die empfangene Nachricht länger als msgsz und ( msgflg & MSG_NOERROR) ungleich 0 ist, wird sie auf msgsz Bytes gekürzt. Der abgeschnittene Teil der Nachricht geht verloren; dem aufrufenden Prozess wird dies nicht mitgeteilt.

msgtyp gibt den Typ der geforderten Nachricht wie folgt an:

  • wenn msgtyp gleich 0 ist, wird die erste Nachricht in der Nachrichtenwarteschlange empfangen;

  • 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 kleiner oder gleich dem Absolutwert von msgtyp empfangen.

msgflg gibt an, welche Aktion ausgeführt werden soll, wenn sich keine Nachricht des geforderten Typs in der Warteschlange befindet. Folgende Aktionen sind möglich:

  • Wenn ( msgflg & PC_NOWAIT) ungleich 0 ist, kehrt die Funktion sofort mit dem Ergebnis -1 zum aufrufenden Prozess zurück und errno ist gleich ENOMSG gesetzt.

  • Wenn ( msgflg & IPC_NOWAIT) gleich 0 ist, unterbricht der aufrufende Prozess seine Ausführung, bis eines der folgenden Ereignisse eintritt:

    • Eine Nachricht des geforderten Typs wird in die Warteschlange eingetragen.

    • Die Warteschlangenkennzahl msqid wird aus dem System entfernt; wenn dies geschieht, wird errno gleich EIDRM gesetzt und das Ergebnis -1 wird zurückgeliefert.

    • Der aufrufende Prozess empfängt ein abzufangendes Signal; in diesem Fall wird die Nachricht nicht empfangen und der Prozess setzt seine Ausführung so fort, wie dies unter sigaction() beschrieben ist.

Bei erfolgreicher Beendigung werden die folgenden Aktionen auf der msqid zugeordneten Datenstruktur ausgeführt:

  • msg_qnum wird um 1 vermindert.

  • msg_lrpid wird gleich der Prozessnummer des aufrufenden Prozesses gesetzt.

  • msg_rtime wird auf die aktuelle Zeit gesetzt.

Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus: Der Parameter msgflg bezieht sich auf den aufrufenden Thread.

Returnwert

Anzahl der in mtext abgelegten Bytes



bei Erfolg.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

msgrcv() schlägt fehl, wenn gilt:

 

E2BIG

Der Wert von mtext ist größer als msgsz, und ( msgflg & MSG_NOERROR) ist gleich 0.

 

EACCES

Der aufrufende Prozess erhält keine Erlaubnis für diese Operation.

 

Erweiterung

 

EFAULT

msgp verweist auf eine unzulässige Adresse. (Ende)

 

EIDRM

Die Warteschlangenkennzahl msqid wurde aus dem System entfernt.

 

EINTR

msgrcv() wurde durch ein Signal unterbrochen.

 

EINVAL

msqid ist keine gültige Warteschlangenkennzahl, oder der Wert von msgsz ist kleiner als 0.

 

ENOMSG

Die Warteschlange enthält keine Nachricht des geforderten Typs, und ( msgtyp & IPC_NOWAIT) ist ungleich 0.

Hinweise

msgp sollte in den Typ void * umgewandelt werden.

Das Kommittee des IEEE 1003.4-Standards entwickelt gerade eine alternative Schnittstelle für die Interprozeßkommunikation. Anwendungsprogrammierer, die Interprozeßkommunikation einsetzen, sollten die Anwendungen so konzipieren, daß Module, die derzeit beschriebene Funktionen für Interprozeßkommunikation benutzen, einfach geändert werden können.

Siehe auch

auch msgctl(), msgget(), msgsnd(), sigaction(), sys/msg.h, Abschnitt "Interprozesskommunikation“.