stdout Redirect - Daten kommen immer blockweise

  • Hallo zusammen!


    Ich wollte mittels einer SCP-Verbindung meinen VDR "fernsteuern" und mir Daten über SCP schicken lassen. Dazu wollte ich mir mit C# ein Tool bauen, dass StdOut von WinSCP.com liest und über StdIn dieses Prozesses die entsprechenden Anweisungen an WinSCP gibt.


    Das Tool kann ich prima einsetzen, um z.B. cmd.exe zu steuern. Soblad ich allerdings WinSCP.com starte, erhalte ich nur noch häppchenweise die Ausgabe (aber dann alles auf einmal). Ich hatte im Netz noch einen C++-Code gefunden, der hat allerdings das gleiche Problem.


    Also tippe ich mal darauf, dass WinSCP.com irgendwie anders mit stdout umgeht.


    Kennt jemand von Euch den Grund? Oder vielleicht sogar eine Lösung für dieses Problem?


    Gruß,
    Bienchen :)

  • vermutlich ist die Ausgabe oder Eingabe "buffered", d.h. es müssen erst mal z.B. 512 Byte zusammenkommen, bevor was weitergegeben wird. Das macht bei Platten Sinn, da ja nur ganze Sektoren geschrieben werden können; bei Tastatur und Bildschirm (Commandline) macht das weniger Sinn. Vielleicht bringt es etwas, die Eingabe in C# unbuffered zumachen, falls nicht müsstest Du die Ausgabe von Winscp zusätzlich unbuffered machen...

  • Naja, cmd.exe liefert ja die Ausgabe direkt weiter, sobald ich in der Instant aber winscp starte, gibt es das Problem. Willst Du sagen, dass ich die WinSCP Command-Line-App neu kompilieren soll? Gibt es dazu überhaupt den Source?


    Gruß,
    Bienchen :)

  • WinSCP ist OpenSource, du kannst also durchaus auch selbst Hand anlegen...
    Den Source findest du auf der WinSCP Download-Seite.

    VDR1: AMD Duron-1300, 512mb RAM, Nexus-S rev2.1, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    VDR2: Athlon XP-M-2600+, 512mb RAM, TT Prem 1.3 DVB-S, Skystar2, Airstar 2, Debian Lenny, kernel: 2.6.28-etobi.3, VDR 1.6.0-17 experimental/extensions von Tobi
    Extern: Activy300, Gen2VDR V2

  • Hallo bienchen,


    Zitat

    Original von bienchen
    ...Kennt jemand von Euch den Grund? Oder vielleicht sogar eine Lösung für dieses Problem?


    Es wurde ja schon vom Ausgabepuffer gesprochen, ich umgehe das immer indem ich stdout auf stderr umleite. stderr läuft ohne Puffer.


    Code
    xyz ... >&2


    Hardy

    Suche: 6 Richtige für die nächste Lottoziehung
    PS: Wer Rechtschreibfehler findet, darf sie behalten!

  • Hallo zusammen,


    danke für die Tipps! Ich schau mal, ob ich damit weiterkomme!


    HFlor: leider funktioniert es auch mit er Umleitung nicht. Ich denke, dass es daran liegt, dass WinSCP die Daten schon buffered ausgibt, d.h. die Umleitung bekommt diese Daten dann natürlich auch nur blockweise. Hat es bei Dir schonmal funktioniert? Wenn ja, in welchem Zusammenhang?


    Gruß,
    Bienchen :)

  • Hallo Hardy,


    Zitat

    Original von HFlor
    Es wurde ja schon vom Ausgabepuffer gesprochen, ich umgehe das immer indem ich stdout auf stderr umleite. stderr läuft ohne Puffer.


    Code
    xyz ... >&2


    Guter tipp :)


    Evt. OT - aber wie kriegt man das ganze jetzt ungecacht in ein logfiles nachdem man stdout in stderr umgeleitet hat !?
    Ein " 2>/tmp/test.log 1>&2" klappt z.b. nicht - auch nicht in umgekerhter reihenfolge ...


    Gruß
    Viking

  • Zitat

    Ein " 2>/tmp/test.log 1>&2" klappt z.b. nicht - auch nicht in umgekerhter reihenfolge ...


    wieso?

    Code
    ls _DOES_NOT_EXIST_ 2> yyyy 1>&2

    funktioniert doch?


    [EDIT] sorry es war der falsche Test zum richtigen Problem:) So muss es heissen:


    Code
    echo xxxx 2> YYYYYY 1>&2

    funktioniert auch.


    [/EDIT]

  • Hallo Sparkie,


    ja, funktioniert in der tat - aber ... stdout wird wieder gecacht ;) d.h. errout kommt nicht parallel zu stdout im logfile an ...


    Habe gerade kein kleines beispiel zur hand. Konnte aber mit 1>&2 gearde ein problem mit Giantdisc lösen. Es lies sich aber nicht in ein logfile schreiben - mußte auf der konsole die ausgabe machen und dann hochscrollen.
    Siehe auch hier :
    http://giantdisc.org/forum/viewtopic.php?p=2753#2753


    Man sieht das die siebte zeile :

    SQL
    SELECT count(*) AS cnt, LEFT(genre,1) AS gen FROMDBD::mysql::st execute failed:

    zur hälfte stdout (bis FROM) und zur hälfte stdout ist (Ab DBD:: ).
    Das habe ich nicht hingekriegt in ein logfile zu schreiben.


    Gruß
    Viking

  • Zitat

    ja, funktioniert in der tat - aber ... stdout wird wieder gecacht


    ich frage mich, inwieweit der Tipp von Hflor tatsaechlich funktionieren kann.


    Das Caching erfolgt doch in der libc. Prueft diese tatsaechlich dynamisch nach, womit stdout /stderr gerade assoziiert ist, und aendert dann entsprechend das Caching-Verhalten?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!