Thread Pipes: kleines Verständnis Problem (4 answers)
Opened by sid burn at 2006-06-19 23:40

sid burn
 2006-06-19 23:40
#67452 #67452
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hi zusammen,
ich habe zur Zeit ein kleines Verständnis Problem mit Pipes. Den größten Teil des Problems habe ich mit Testen gelößt, mir sind aber bestimmte Sachen noch nicht ganz klar, und hoffe ihr könnt mir dabei Helfen.

Ich selber wollte ersteinmal Testweise wissen wie ich einen Parallelen Prozess starten kann, und diesen laufen lassen kann, und dabei trotzdem noch das Perl Programm weiter läuft.

2 Möglichkeiten gab es da also. (Bestimmt gibt es noch mehrere...)

Code: (dl )
1
2
open PIPE, "| grep -i welt";
open PIPE, "cat datei |";


Die erste Lösung soll also bedeuten das alles was ich an <PIPE> sende sozusagen nach grep gepiped wird. Auf der Shell also identisch mit:

Code: (dl )
$ Mein_Programm | grep -i welt


Die Zweite Lösung wird zum Lesen benutzt. Als Shellkommando also identisch mit:

Code: (dl )
$ cat datei | Mein_Programm



Ich hatte also zum testen mal "tethereal" aufgerufen, und wollte den Inhalt einfach nur wieder ausgeben, um auch zu schauen ob das mit dem Parallelen Prozess klappt. Das dies kein Sinn hat ist mir schon klar, ich wollte das nur als Test benutzen.

Ich schrieb also folgendes:

Code: (dl )
1
2
3
open ETH, "tethereal |";
print <ETH>;
close ETH;


Naja und zu meinen Verblüffen muss ich sagen, dass dies erstmal nicht klappte, anders als erwartet. Ich habe das auch mal mit "find" ausprobiert, und es scheint so das er erst das Programm ausführt, und erst wenn alles fertig ist, eine Ausgabe erscheint. Die Verwendung war also irgendwie identisch als hätte ich backticks verwendet. Bei einem Prozess wie tethereal der in Echtzeit Informationen ausgibt, und solange läuft wie man es abbricht, ist das ganze sicherlich unbrauchbar.

Zum Testen habe ich also mal das Pipe zeichen nach vorne gestellt, und auf einmal ging es wie erwartet:

Code: (dl )
1
2
3
open ETH, "| tethereal";
print <ETH>;
close ETH;


Dies gibt mir sofort alles aus was tethereal ausgibt. Mein Problem erstmal hierdran. Ich verstehe die Zuordnung nicht mehr. Eigentlich benutzt man diese Schreibweise doch zum Schreiben, und nicht zum Lesen? Und warum erscheint hierbei sofort eine Ausgabe, und beim eigentlichen richtigen Pipe hinten anhängen nicht?


Okay, habe dann nochmal schnell etwas nachgelesen, und habe folgende Lösung gefunden.

Code: (dl )
1
2
3
open ETH, "tethereal |";
print while <ETH>;
close ETH;


Das ganze Funktioniert jetzt genauso wie die Lösung davor. Allerdings verstehe ich nicht ganz warum ich das ganze unbedingt in einer while Schleife erledigen muss, und warum ein print nicht Funktioniert?

Mir ist klar das print im Listenkontext Arbeitet. Passiert also folgendes das die komplette Ausgabe erst komplett eingelesen wird, und dann erst ausgegeben wird?

Da das while Konstrukt ja im Skalaren Kontext Arbeitet liest es nur bis zum nächsten Newline, und gibt den Inhalt aus? Jedenfalls wäre das meine Persönliche Erklärung. Allerdings verstehe ich nicht ganz warum ich hier unbedingt den Skalaren Kontext benutzen muss, und es mit vorangestellten Pipe Zeichen auch im Listenkontext von print arbeitet. Vor allem verstehe ich nicht wie das mit dem vorangestellten Pipe überhaupt Funktionieren soll.


Beim Schreiben bin ich noch auf die Idee gekommen das es vielleicht am Output Buffer liegen könnte warum es mit dem nachgestellten Pipe und dem print nicht klappt. Ich habe also "$| = 1" am Anfang gesetzt. Verändert hat sich allerdings trotzdem nichts, und es gibt die Meldungen immer noch nciht direkt auf dem Bildschirm aus.


Von daher meine Frage was passiert genau beim Ausgeben mit print. Und wie/warum funktioniert das ganze mit dem vorangestellten Pipe?



Eine ganz andere Frage, ich benutze open lieber mit 3 Argumente. Wie kann ich bei 3 Arguementen Angeben das das Pipe vorne bzw. hinten steht?\n\n

<!--EDIT|sid burn|1150746216-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Pipes: kleines Verständnis Problem