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