Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

msgctl(2)

msgget(2)

signal(2)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026