ubuntuusers.de

Pipes bei parallel laufenden Prozessen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

some_tea

Anmeldungsdatum:
27. November 2005

Beiträge: Zähle...

Hallo,
bei pipes ist es ja normalerweise so, dass der Prozess, der seine Eingabe aus der Pipe liest, die Daten erst erhält, wenn der in die Pipe schreibende Prozess beendet ist. Beispiel:
ls | less
ls wird erst ausgeführt, DANACH bekommt less die Ausgabe von ls als Eingabe.
Ist es möglich, das zu umgehen? Ich bräuchte nämlich eine Möglichkeit, die Daten eines Prozesses weiterzuverarbeiten, während dieser Prozess noch läuft, also:
Prozess1 | Prozess2
wobei Prozess1 die ganze Zeit weiterläuft und Daten auf die Standardausgabe schreibt, die aber Prozess2 SOFORT weiterverarbeiten soll.
Danke für Hilfe,
Gruß,
some_tea

xecto Team-Icon

Anmeldungsdatum:
1. März 2005

Beiträge: 1349

Wohnort: Österreich, Baden

Versuche ein Prozess zu starten mit & im Hintergrund zu verschieben, alle Ausgaben in eine Datei umzuleiten, und diese dann mit dem nächsten Prozess wieder ein leiten mit >..

lg xecto

DrScott Team-Icon

Ehemalige
Avatar von DrScott

Anmeldungsdatum:
7. Juli 2005

Beiträge: 6018

Wohnort: Nürnberg

some_tea hat geschrieben:

bei pipes ist es ja normalerweise so, dass der Prozess, der seine Eingabe aus der Pipe liest, die Daten erst erhält, wenn der in die Pipe schreibende Prozess beendet ist. Beispiel:
ls | less
ls wird erst ausgeführt, DANACH bekommt less die Ausgabe von ls als Eingabe.

Hmm, das sehe ich aber anders: mach mal

find / | less

Das Find Kommando ist schon eine zeitlang beschäftigt, doch less präsentiert die ersten Daten unmittelbar.

dehru Team-Icon

Ehemalige
Avatar von dehru

Anmeldungsdatum:
2. Oktober 2005

Beiträge: 2178

Wohnort: Stuttgart

DrScott hat geschrieben:

Hmm, das sehe ich aber anders: mach mal
find / | less
Das Find Kommando ist schon eine zeitlang beschäftigt, doch less präsentiert die ersten Daten unmittelbar.

So ist es. Eine Pipe (Programm_1 | Programm_2) ist eben dazu da, damit das Programm_2 über STDIN Daten von Programm_1 STDOUT erhält, SOLANGE das Programm_1 läuft, und nicht erst dann, wenn das Programm_1 fertig ist.

some_tea hat geschrieben:

bei pipes ist es ja normalerweise so, dass der Prozess, der seine Eingabe aus der Pipe liest, die Daten erst erhält, wenn der in die Pipe schreibende Prozess beendet ist.

Nein, das stimmt so nicht, wie schon DrScott schrieb. Du kannst es sogar selbst testen. Verwendest du z.Bsp. named pipes (man mkfifo), dann kannst du sogar bestimmen, dass das Programm_2 aus einer Pipe liest, die noch nicht befüllt wird. Erst später kommt dann das Programm_1, das in die named pipe schreibt. Der Prozess, in dem das Programm_2 aus der named pipe liest, wartet, bis das Programm_1 in die named pipe schreibt.

some_tea

(Themenstarter)

Anmeldungsdatum:
27. November 2005

Beiträge: 10

Hi,
danke für eure Antworten.
Stimmt. Ihr habt Recht. Die Prozesse laufen parallel.
Irgendwie klappt das in meinem Fall bloß nicht. Ich habe einen AIML-Interpreter in c++ programmiert (einen so genannten chatbot), der seine Ausgabe mittels cout auf die Standardausgabe schreibt. Mein Ziel ist es, diese Ausgabe jetzt mit Hilfe des Programms festival vorlesen zu lassen. Was ich tue, ist folgendes:
./qalice | festival --tts
Oder auch mit FIFOS:
mkfifo pipe
./qalice > pipe & festival --tts < pipe

Das Ergebnis ist in beiden Fällen das gleiche: Sobald das Programm qalice beendet ist, liest festival die gesamte Ausgabe am Stück vor. Während das Programm noch läuft, passiert nichts.

Ich vermute nun, dass das Problem eher bei festival liegt als bei meinen bash-Kentnissen. Wahrscheinlich wartet festival immer auf ein EOF (end of file), bis es zu arbeiten anfängt.

Trotzdem danke,
Gruß,
some_tea

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Ich vermute nun, dass das Problem eher bei festival liegt als bei meinen bash-Kentnissen. Wahrscheinlich wartet festival immer auf ein EOF (end of file), bis es zu arbeiten anfängt.

Ja das tut es.

Wenn du nur "festival --tts" eingibst wartet das Programm auf eine Eingabe, du kannst dort dann Texte Eingeben. Eine Ausgabe erfolgt erst wenn du "STRG+D" drückst, was für EOF steht. Müsstest du in deinem Programm also irgendwie anpassen das nach jedem Wort ein EOF kommt, oder vielleicht gibt es ja bei festival noch einen anderen Modus.

Antworten |