In Lese-Puffer einer externen Anwendung schreiben?



  • chille07 schrieb:

    ok...
    dann mit Pipes...

    Aber eines müsste man mir noch erklären (bin vor kurzem erst von C auf C++ umgestiegen):

    Was genau sind Pipes, und wie meint er das mit:

    interpreter schrieb:

    $foo | bar
    bar liest per cin etc die Ausgaben von foo

    Mit Pipes kann ich stdout eines Prozesses mit stdin eines anderen verknüpfen. Simples Beispiel:
    cat foo | wc -w

    Das Programm cat liest foo ein und gibt die Datei nach stdout aus. Per Pipe-Operator verknüpft jetzt die Shell stdout von cat mit stdin von wc. wc (wordcount) liest jetzt von stdin und zählt die Wörtr (aus foo).



  • ähm...

    ok, aber wie baue ich so etwas in einen Quellcode ein.

    Nehmen wir an... es gibt 2 Dateien:
    😉 PROG1
    😉 STEUERUNG

    Kannst du mir ein Bsp.: zeigen, wie ich jetzt im Programm "STEUERUNG" die Ausgaben des "PROG1" erhalte, und das "PROG1" als Eingabe die Ausgabe der "STEUERUNG" verwenden?

    weil...

    cat foo | wc -w
    


  • Du brauchst selbst gar nichts extra einbauen, Du liest einfach von stdin und schreibst nach stdout, dann kannst Du Deine Programme via Pipe zusammenhängen.



  • und...

    wo, wie hänge ich die Programme zusammen?



  • Wie bereits gesagt: Mit einer Pipe.

    Kannst du mir ein Bsp.: zeigen, wie ich jetzt im Programm "STEUERUNG" die Ausgaben des "PROG1" erhalte, und das "PROG1" als Eingabe die Ausgabe der "STEUERUNG" verwenden?

    PROG1 | STEUERUNG #Ausgabe von PROG1 als Eingabe für STEUERUNG verwenden
    STEUERUNG | PROG1 #Ausgabe von STEUERUNG als Eingabe für PROG1 verwenden
    

    Sowas sollte mit den meisten Shells funktionieren.



  • aha... jetz sind wir bei shells...

    😡 i hate not to know, what other people are talking about.

    dh. Wie geht das jetzt mit den shells?



  • chille07 schrieb:

    aha... jetz sind wir bei shells...

    😡 i hate not to know, what other people are talking about.

    dh. Wie geht das jetzt mit den shells?

    Wie wärs, wenn du dich mal ein paar Stunden mit Konsolen und Pipes beschäftigst?
    Wie oft sollen wirs eigentlich noch sagen: Deine Programme müssen nur von stdin lesen und nach stdout schreiben! Den Rest macht quasi das Betriebssystem.



  • ja mit Konsolen kann ich (im Windows) arbeiten...

    aber mir hat ja noch niemand gesagt, wie zB der Befehl etc. heisst, oder wie was ich mit dem CMD machen soll...

    dh. wie ich pipes mit cmd aufbaue.



  • Hm, vielleicht scheiterts ja daran: Das da ist eine Pipe: | (Sieht zwar komisch aus, is aber so. 😉 )
    Und jetzt lies nochmal was bereits geschrieben wurde.



  • danke,
    es geht

    aber...

    ich habe es wie folgt gemacht:

    in eine batch-Datei:

    pipe2.exe | pipe1.exe
    

    das ist aber (und das frage ich jetzt warum) nicht äquivalent mit

    pipe1.exe | pipe2.exe
    

    nochwas...

    warum steht unten das:

    cat foo | wc -w
    

    hmm...
    cat ist eine datei.
    foo ist ein parameter
    wc ist eine Datei
    -w ist ein Parameter?

    war das so gemeint?



  • chille07 schrieb:

    pipe2.exe | pipe1.exe
    

    das ist aber (und das frage ich jetzt warum) nicht äquivalent mit

    pipe1.exe | pipe2.exe
    

    Weil im 2. Fall eben alle Ausgaben von pip1.exe der Eingabe von pipe2 zur Verfügung gestellt werden. Im 1. Fall bekommt pipe1 die Ausgaben von pipe2

    cat foo | wc -w
    

    hmm...
    cat ist eine datei.

    Nein. Cat ist das Programm (concatenation)

    foo ist ein parameter

    Ja. foo bezeichnet in dem Fall den Namen einer Datei.

    wc ist eine Datei

    Nein. wc ist ein Programm.

    -w ist ein Parameter?

    Ja. w ist ein Parameter für das Programm wc (-w = word, wc soll also nur alle Wörter zählen)



  • Sorry,

    mit datei habe ich natürlich Programm gemeint.

    Noch ne Frage... funktioniert das NUR in der C++-Konsole oder auch in Anwendungen... zB.: Word||InternetExplorer||... also in ganz "normalen" Programmen?



  • Prinzipiell funktioniert es mit jedem Programm, dass von stdin liest und auf stdout schreibt.
    BTW: Es gibt keine C++ Konsole 😉



  • interpreter schrieb:

    chille07 schrieb:

    pipe2.exe | pipe1.exe
    

    das ist aber (und das frage ich jetzt warum) nicht äquivalent mit

    pipe1.exe | pipe2.exe
    

    Weil im 2. Fall eben alle Ausgaben von pip1.exe der Eingabe von pipe2 zur Verfügung gestellt werden. Im 1. Fall bekommt pipe1 die Ausgaben von pipe2

    Ja, Pipes sind unidirektional.



  • chille07 schrieb:

    Noch ne Frage... funktioniert das NUR in der C++-Konsole oder auch in Anwendungen... zB.: Word||InternetExplorer||... also in ganz "normalen" Programmen?

    Nein.
    Word gibt nix auf die Standardausgabe aus und Internet Explorer lässt sich IMO auch nicht derart als Pager verwenden.



  • Deine Programme müssen nur von stdin lesen und nach stdout schreiben!

    Ich habe jetzt f. gefunden:

    cout<<"\nDies geht nach stdout";
    cerr<<"\nFehlermeldungen gehen nach stderr";
    clog<<"\noder sie gehen nach clog";
    

    heisst das, das nur die Ausgaben von "cout" "übermittelt" werden?



  • chille07 schrieb:

    cout<<"\nDies geht nach stdout";
    cerr<<"\nFehlermeldungen gehen nach stderr";
    clog<<"\noder sie gehen nach clog";
    

    heisst das, das nur die Ausgaben von "cout" "übermittelt" werden?

    Du kannst sowohl stderr als auch stdout umleiten, ich weiß aber nicht wie genau das unter Windows geht.



  • chille07 schrieb:

    Deine Programme müssen nur von stdin lesen und nach stdout schreiben!

    Ich habe jetzt f. gefunden:

    cout<<"\nDies geht nach stdout";
    cerr<<"\nFehlermeldungen gehen nach stderr";
    clog<<"\noder sie gehen nach clog";
    

    heisst das, das nur die Ausgaben von "cout" "übermittelt" werden?

    ja, genau.... 🙂

    wenn du irgendwo

    Programm1.exe | Programm2.exe
    

    siehst, dann kannst du den | in Gedanken ersetzen durch "schreib meine Daten an"...

    cout (und printf()) schreiben Standardmaessig immer an "stdout" ("Standardoutput"), und cin liesst von "stdin".... stdout und stdin kannst du dir als Betriebssystemfunktionen vorstellen, die den Output eines Programmes an einen bestimmten Ort leiten (im Falle von stdout) umgekehrt (im Falle von stdin). In normalen Konsolenprogrammen ist dieser "ORT" die Konsole.... Mit der Pipe sagst du jetzt "biege den stdout von Programm1 so um, dass er auf den selben Ort zeigt wie der stdin von Programm2...

    Mit Word oder dem IE geht das nicht, die verwenden fuer I/O (input/output 😉 ) nicht STDOUT und STDIN. stdin und -out sind dafuer gedacht, reinen Text zu transportieren, fuer "grafische" Anwendungen sind die nicht vorgesehen (und werden dementsprechend auch nicht verwendet).

    Ich hoff das war jetzt verstaendlich 🙂

    @nman, interpreter:
    ihr solltet eigentlich gerafft haben, dass der Threadersteller keine Erfahrung mit Linux, Shells oder Streams hat...



  • Blue-Tiger schrieb:

    @nman, interpreter:
    ihr solltet eigentlich gerafft haben, dass der Threadersteller keine Erfahrung mit Linux, Shells oder Streams hat...

    Dennoch waren unsere Ausführungen ziemlich deppensicher; Shells und Pipes gibts ja nicht nur unter Unix.

    Wenn mir jemand Tips gibt die Fachbegriffe enthalten die ich nicht kenne dann versuche ich auf alle Fälle mal herauszufinden, was diese bedeuten.
    Ein wenig Eigeninitiative von seiten der jeweiligen Fragesteller wäre schon wünschenswert, ich habe einfach keine Lust immer alles so vorzukauen wie du das gerade getan hast.



  • nman schrieb:

    Blue-Tiger schrieb:

    @nman, interpreter:
    ihr solltet eigentlich gerafft haben, dass der Threadersteller keine Erfahrung mit Linux, Shells oder Streams hat...

    Dennoch waren unsere Ausführungen ziemlich deppensicher; Shells und Pipes gibts ja nicht nur unter Unix.

    Wenn mir jemand Tips gibt die Fachbegriffe enthalten die ich nicht kenne dann versuche ich auf alle Fälle mal herauszufinden, was diese bedeuten.
    Ein wenig Eigeninitiative von seiten der jeweiligen Fragesteller wäre schon wünschenswert, ich habe einfach keine Lust immer alles so vorzukauen wie du das gerade getan hast.

    Ok, hast ja recht... 🙂 nur hing der Threadersteller nach 2 Seiten voller "Leite stdout von P1 ueber eine Pipe um, und P2 kann dann normal ueber stdin lesen" immer noch ziemlich in der Luft, da kann man ruhig expliziter werden (entweder indem man ihm mehr erklaert oder explizit auf google verweisst) 🙂

    EDIT: denn nicht jeder hat schonmal intensiver DOS oder Linux/Unix verwendet und ist mit dem Shell-Konzept vertraut


Anmelden zum Antworten