Das einzige, was an Ihrer Frage als falsch auffällt, ist, dass Sie sagen
A würde zuerst laufen, dann bekommt B die Standardabweichung von A
Tatsächlich würden beide Programme fast zur gleichen Zeit gestartet. Wenn es keine Eingabe für B
den Leseversuch gibt, wird es blockiert, bis es eine Eingabe zum Lesen gibt. Wenn niemand die Ausgabe liest A
, werden die Schreibvorgänge blockiert, bis die Ausgabe gelesen wurde (ein Teil wird von der Pipe gepuffert).
Das einzige, was die an einer Pipeline beteiligten Prozesse synchronisiert, ist die E / A, dh das Lesen und Schreiben über die Pipeline. Geschieht kein Schreiben oder Lesen, laufen die beiden Prozesse völlig unabhängig voneinander ab. Wenn einer das Lesen oder Schreiben des anderen ignoriert, wird der ignorierte Prozess blockiert und schließlich durch ein SIGPIPE
Signal abgebrochen (wenn geschrieben wird) oder eine Dateiendebedingung in seinem Standardeingabestream abgerufen (wenn gelesen wird), wenn der andere Prozess beendet wird .
Die idiomatische Art zu beschreiben A | B
ist, dass es sich um eine Pipeline handelt, die zwei Programme enthält. Die Ausgabe, die auf der Standardausgabe des ersten Programms erzeugt wird, kann auf der Standardeingabe von der zweiten gelesen werden ("[die Ausgabe von] A
wird in [die Eingabe von] geleitet B
"). Die Shell übernimmt die erforderlichen Installationsarbeiten, um dies zu ermöglichen.
Wenn Sie die Wörter "Verbraucher" und "Erzeuger" verwenden möchten, ist das vermutlich auch in Ordnung.
Die Tatsache, dass dies in C geschriebene Programme sind, ist nicht relevant. Die Tatsache, dass es sich um Linux, MacOS, OpenBSD oder AIX handelt, spielt keine Rolle.