Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

msgsnd - Nachricht an Warteschlange senden

&pagelevel(4)&pagelevel

Definition

#include <sys/msg.h>

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

Beschreibung

msgsnd() sendet eine Nachricht an die Warteschlange, die durch die Warteschlangenkennzahl msqid angegeben wird.

msgp zeigt auf einen benutzerdefinierten Puffer, der eine Komponente des Typs long int für den Nachrichtentyp und einen Datenbereich für die Bytes der Nachricht enthalten muss. Die nachstehende Struktur ist ein Beispiel dafür, wie der benutzerdefinierte Puffer aussehen könnte:

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

Die Strukturkomponente mtype ist ein von 0 verschiedener Wert vom Typ long int, der vom empfangenden Prozess zur Nachrichtenauswahl verwendet werden kann.

Die Strukturkomponente mtext ist ein Text der Länge msgsz Bytes. msgsz kann von 0 bis zu einem systembedingten Grenzwert reichen.

msgflg gibt an, welche Aktion ausgeführt werden soll, wenn eine oder mehrere der folgenden Bedingungen erfüllt sind:

  • Die Anzahl der Bytes in der Warteschlange ist bereits gleich msg_qbytes (siehe auch sys/msg.h).

  • Die Gesamtzahl der Nachrichten in allen Warteschlangen des Systems ist bereits gleich der durch das System festgelegten Grenze.

Folgende Aktionen können dann ausgeführt werden:

  • Wenn ( msgflg & IPC_NOWAIT) ungleich 0 ist, wird keine Nachricht gesendet und die Funktion kehrt sofort zum aufrufenden Prozess zurück.

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

    • Die Bedingung, die für die Unterbrechung verantwortlich war, existiert nicht mehr; in diesem Fall wird die Nachricht gesendet.

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

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

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

  • msg_qnum wird um 1 erhöht

  • msg_lspid wird gleich der Prozessnummer des aufrufenden Prozesses gesetzt

  • msg_stime 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 aufrufendenThread.

Returnwert

0

bei Erfolg.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen

Fehler

msgsnd() schlägt fehl, wenn gilt: 

 

EACCES

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

 

EAGAIN

Die Nachricht kann aus einem der oben genannten Gründe nicht gesendet werden und ( msgflg & IPC_NOWAIT) ist ungleich 0.


Erweiterung

 

EFAULT

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

 

EIDRM

Die Warteschlangenkennzahl msqid wurde aus dem System entfernt.

 

EINTR

msgsnd() wurde durch ein Signal unterbrochen.

 

EINVAL

msqid ist keine gültige Warteschlangenkennzahl,
oder der Wert von mtype ist kleiner als 0,
oder der Wert von msgsz ist kleiner als 0 oder größer als der systembedingte Grenzwert.

Hinweise

Der Wert des Arguments 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

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