Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ coproc(1F) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

awk(1)

cat(1)

sed(1)

vsig(1F)

coproc(1F)          (Form and Menu Language Interpreter)         coproc(1F)

NAME
     coproc: cocreate, cosend, cocheck, coreceive, codestroy - Mit einem
     Prozeß kommunizieren

SYNTAX
     cocreate [-r rpath] [-w wpath] [-i id] [-R refname] [-s sendstring]
              [-e expectstring] command

     cosend [-n] procid string

     cocheck procid

     coreceive procid

     codestroy [-R refname] procid [string]

BESCHREIBUNG
     Diese kooperierenden Funktionen stellen ein flexibles Mittel für die
     Interaktion zwischen FMLI (Form and Menu Language Interpreter) und
     einem unabhängigen Prozeß dar. Mit ihrer Hilfe kann FMLI insbesondere
     auch auf asynchrone Aktivitäten reagieren.

     Die Funktion cocreate startet command als Koprozeß und initialisiert
     die Kommunikation durch Einrichtung von Pipes zwischen FMLI und der
     Standardeingabe und -ausgabe von command. Das Argument command muß ein
     Kommando mit den zugehörigen Argumenten (falls vorhanden) sein. Dies
     bedeutet, daß command bei seiner Eingabe (von cosend gesendete) Zei-
     chenketten erwartet und bei seiner Ausgabe Informationen sendet, die
     von FMLI auf verschiedene Arten behandelt werden können. Die folgenden
     Optionen können mit cocreate verwendet werden:

     -r rpath
          Wenn -r angegeben wird, ist rpath der Pfadname, aus dem FMLI
          Informationen liest. Diese Option wird normalerweise zum Einrich-
          ten der Kommunikation mit Prozessen verwendet, die gewöhnlich in
          einen bestimmten Pfad schreiben. Wenn -r nicht angegeben ist,
          wählt cocreate einen eindeutigen Pfad in /var/tmp.

     -w wpath
          Wenn -w angegeben wird, ist wpath der Pfadname, in den cosend
          Informationen schreibt. Diese Option wird normalerweise verwen-
          det, damit ein Prozeß mit vielen verschiedenen FMLI-Prozessen
          über dieselbe Pipe kommunizieren kann. Wenn -w nicht angegeben
          ist, wählt cocreate einen eindeutigen Pfad in /var/tmp.

     -i id
          Wenn -i angegeben wird, ist id ein alternativer Name für den
          Koprozeß, der von dieser Funktion cocreate initialisiert wurde.
          Wenn -i nicht angegeben ist, nimmt id standardmäßig den Wert
          command an. Im Gegensatz zu command kann das Argument id später
          mit den anderen kooperierenden Funktionen verwendet werden. Diese
          Option wird normalerweise verwendet, da sie die Erstellung von



Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

coproc(1F)          (Form and Menu Language Interpreter)         coproc(1F)

          zwei oder mehr Koprozessen erleichtert, die vom selben command
          erzeugt wurden. (Zum Beispiel cocreate -i ID1 program args und
          cocreate -i ID2 program differentargs.)

     -R refname
          Wenn -R angegeben wird, ist refname ein lokaler Name für den
          Koprozeß. Die Funktion cocreate kann mehrmals aufgerufen werden.
          Daher ist ein refname hilfreich, wenn ein zweites oder ein weite-
          res Mal auf denselben Koprozeß verwiesen wird. Wenn ein Koprozeß
          bereits bei der Angabe der Option -R vorhanden ist, wird kein
          neuer Koprozeß erstellt. Dieselben Pipes werden gemeinsam
          benutzt. refname kann dann als ein Argument für die Option -R
          codestroy verwendet werden, wenn Sie eine bestimmte Verbindung zu
          einem Koprozeß beenden und andere Verbindungen nicht ändern möch-
          ten. (Der Koprozeß wird nur beendet, nachdem codestroy -R so oft
          wie cocreate -R aufgerufen wurde.)

     -s sendstring
          Die Option -s gibt sendstring als eine Zeichenkette an, die an
          jede Ausgabe angehängt wird, die mit Hilfe von cosend an den
          Koprozeß gesendet wurde. Mit dieser Option kann ein Koprozeß
          erkennen, wann die Eingabe von FMLI beendet ist. Standardmäßig
          ist sendstring ein Zeilenvorschub, wenn -s nicht angegeben wird.

     -e expectstring
          Die Option -e gibt expectstring als eine Zeichenkette an, die
          das Ende jeder Ausgabe kennzeichnet, die vom Koprozeß zurückgege-
          ben wird. (Hinweis: expectstring muß nur der Anfang einer Zeile
          sein. Am Ende der Koprozeßausgabe muß sich ein Zeilenvorschub
          befinden.) Mit dieser Option kann FMLI erkennen, wann die Ausgabe
          des Koprozesses beendet ist. Standardmäßig ist expectstring ein
          Zeilenvorschub, wenn -e nicht angegeben wird.

     Die Funktion cosend sendet string über die von cocreate (optional
     wpath) eingerichtete Pipe an den durch procid gekennzeichneten Kopro-
     zeß, wobei procid entweder das Kommando command oder die ID id sein
     kann, die in cocreate angegeben werden. Standardmäßig blockiert cosend
     und wartet auf eine Antwort des Koprozesses. Ebenso standardmäßig sen-
     det FMLI keine Zeichenkette sendstring und erwartet keine Zeichen-
     kette expectstring (außer einem Zeilenvorschub). Das heißt, FMLI
     liest nur eine Zeile der Ausgabe des Koprozesses. Wenn -e
     expectstring beim Erstellen der Pipe nicht definiert wurde, besteht
     die Ausgabe des Koprozesses aus einer einzelnen beliebigen Zeichen-
     kette gefolgt von einem Zeilenvorschub. Alle anderen Zeilen der Aus-
     gabe bleiben in der Pipe. Wenn die Option -e beim Erstellen der Pipe
     angegeben wurde, liest cosend so lange Zeilen aus der Pipe, bis eine
     Zeile gelesen wird, die mit expectstring beginnt. Die Ausgabe von
     cosend umfaßt alle Zeilen außer der Zeile, die mit expectstring
     beginnt. Die folgende Option kann mit cosend verwendet werden:





Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

coproc(1F)          (Form and Menu Language Interpreter)         coproc(1F)

     -n   Wenn die Option -n angegeben wird, wartet cosend nicht auf eine
          Antwort des Koprozesses, sondern wird ohne Ausgabe beendet. Wenn
          die Option -n nicht verwendet wird, blockiert FMLI bei einem
          Koprozeß, der nicht antwortet, permanent, da auf eine Eingabe des
          Koprozesses gewartet wird.

     Die Funktion cocheck bestimmt, ob eine Eingabe von dem durch procid
     gekennzeichneten Prozeß verfügbar ist, wobei procid entweder das Kom-
     mando command oder die ID id sein kann, die in cocreate angegeben wer-
     den. Sie gibt einen booleschen Wert zurück, wodurch sich cocheck für
     if-Anweisungen sowie für andere Ausdrücke in rückwärts gerichteten
     Hochkommata in booleschen Ausdrücken eignet. cocheck empfängt keine
     Eingabe des Koprozesses sondern kennzeichnet nur, ob eine Eingabe vom
     Koprozeß verfügbar ist. Sie müssen coreceive verwenden, um die Eingabe
     tatsächlich zu akzeptieren. Die Funktion cocheck kann von einem
     Deskriptor reread aufgerufen werden, um ein Fenster zu aktualisieren,
     wenn neue Daten verfügbar sind. Dies ist nützlich, wenn der Standard-
     wert eines Feldes in einem Formular coreceive einschließt.

     Die Funktion coreceive wird zum Lesen der Eingabe des durch procid
     gekennzeichneten Koprozesses verwendet, wobei procid entweder das
     Kommando command oder die ID id sein kann, die in cocreate angegeben
     werden. Diese Funktion sollte nur verwendet werden, wenn mit cocheck
     festgstellt wurde, daß tatsächlich eine Eingabe verfügbar ist. Wenn
     die Option -e beim Erstellen des Koprozesses verwendet wurde, gibt
     coreceive so lange Zeilen aus, bis expectstring gelesen wird. An die-
     sem Punkt wird coreceive beendet. Die Ausgabe von coreceive umfaßt
     alle gelesenen Zeilen außer der Zeile, die mit expectstring beginnt.
     Wenn die Option -e nicht in cocreate verwendet wurde, gibt jeder Auf-
     ruf von coreceive exakt eine Zeile des Koprozesses aus. Wenn beim Auf-
     rufen von coreceive keine Eingabe verfügbar ist, wird diese Funktion
     ohne Ausgabe beendet.

     Die Funktion codestroy beendet die Schreib-/Lese-Pipes für proc-id,
     wobei procid entweder das Kommando command oder die ID id sein kann,
     die in cocreate angegeben werden. Sie erzeugt ein Signal SIGPIPE für
     den (Sohn-)Koprozeß. Hierdurch wird der Koprozeß abgebrochen (kill),
     es sei denn, der Koprozeß ignoriert das Signal SIGPIPE. Wenn der
     Koprozeß das Signal SIGPIPE ignoriert, stirbt er nicht, auch wenn der
     FMLI-Prozeß beendet wird (die Vaterprozeß-ID des Koprozesses ist 1).

     Das optionale Argument string wird vor dem Tod des Koprozesses an den
     Koprozeß gesendet. Wenn string nicht verfügbar ist, wird eine NULL-
     Zeichenkette übergeben, gefolgt von dem normalen sendstring (stan-
     dardmäßig ein Zeilenvorschub). codestroy ruft also cosend procid
     string auf. Dies bedeutet, daß codestroy jede vom Koprozeß erzeugte
     Ausgabe auf stdout schreibt. Wenn beispielsweise ein interaktiver
     Koprozeß so geschrieben wird, daß er nach dem Beenden der Kommunika-
     tion eine Abbruchzeichenkette (quit) erwartet, kann der Deskriptor
     close folgendermaßen definiert werden:

          close=`codestroy ID 'quit' | message`


Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

coproc(1F)          (Form and Menu Language Interpreter)         coproc(1F)

     Jede Ausgabe, die vom Koprozeß erzeugt wird, wenn die Zeichenkette
     quit über codestroy (mit Hilfe von cosend) an ihn gesendet wurde,
     würde dann an die Meldungszeile umgeleitet werden.

     Der Funktion codestroy sollte normalerweise die Option -R zugewiesen
     werden, da Sie mehrere Prozesse mit demselben Namen haben können und
     sicherlich nicht den falschen Prozeß abbrechen möchten. codestroy ver-
     folgt die Anzahl von refnames, die Sie einem Prozeß mit cocreate zuge-
     wiesen haben. Wenn der letzte refname abgebrochen wird, wird der Pro-
     zeß (id) abgebrochen. codestroy wird normalerweise als Teil eines
     Deskriptors close aufgerufen, da close beim Schließen eines Fensters
     ausgewertet wird. Dies ist wichtig, da der Koprozeß weiterhin ausge-
     führt wird, wenn codestroy nicht aufgerufen wird.

     Für das Schreiben von Programmen, die als Koprozesse verwendet werden,
     können die folgenden Hinweise nützlich sein. Wenn das Koprozeßprogramm
     in der Sprache C geschrieben wird, muß die Ausgabe gelöscht werden,
     nachdem in die Pipe geschrieben wurde. Derzeit können awk(1) und
     sed(1) nicht in einem Koprozeßprogramm verwendet werden, da sie den
     Puffer nach den Zeilen der Ausgabe nicht löschen.) Shell-Skripts sind
     hierzu zwar geeignet, aber langsam. Die Sprache C wird empfohlen.
     Falls möglich, verwenden Sie die Standardoptionen sendstring, rpath
     und wpath. In den meisten Fällen muß expectstring angegeben werden.
     Dies hängt natürlich vom Koprozeß ab.

     Falls eine asynchrone Kommunikation von einem Koprozeß aus gewünscht
     wird, sollte ein Koprozeßprogramm vsig verwenden, um Zeichenketten in
     die Pipe zu stellen und FMLI anschließend zu signalisieren, daß die
     Ausgabe des Koprozesses zur Verfügung steht. Daraufhin wird der
     Deskriptor reread aller Fenster sofort ausgewertet.

BEISPIELE
        .
        .
        .
     init=`cocreate -i BIGPROCESS initialize`
     close=`codestroy BIGPROCESS`
        .
        .
        .
     reread=`cocheck BIGPROCESS`

     name=`cosend -n BIGPROCESS field1`
        .
        .
        .
     name="Receive field"
     inactive=TRUE
     value=`coreceive BIGPROCESS`





Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

coproc(1F)          (Form and Menu Language Interpreter)         coproc(1F)

HINWEISE
     Wenn cosend ohne die Option -n verwendet wird, wird FMLI von einem
     nicht antwortenden Prozeß permanent blockiert.

     Es sollten keine nichtalphabetischen Zeichen in den Ein- und Ausgabe-
     zeichenketten für einen Koprozeß verwendet werden, da diese möglicher-
     weise nicht korrekt übertragen werden.

SIEHE AUCH
     awk(1), cat(1), sed(1), vsig(1F).












































Seite 5                      Reliant UNIX 5.44               Gedruckt 11/98

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