cygwin: Ausgabe friert ein, bis das Programm beendet ist

1

Ich benutze Cygwin unter Windows XP.

Es gibt zum Beispiel ein Problem mit Mercurial.

Angenommen, ich muss mein Repo mit mehreren Subrepos auf den Remote-Server übertragen. Dieser Vorgang dauert ca. 20 Sekunden.

Wenn ich rufe hgaus cmd.exe, sehe ich alle Aktionen in Echtzeit:

pushing subrepo ..... to .....
searching for changes

usw. Alles ist in Ordnung.

Wenn ich es jedoch vom Cygwin-Terminal aus aufrufe, drücke ich die hg pushEingabetaste und es wird ungefähr 20 Sekunden lang nichts an die Konsole zurückgesendet. Alle Protokolle werden dann sofort angezeigt .

Warum ist das so und wie kann ich das vermeiden?

Dmitry Frank
quelle
Die Cygwin-Shell verwendet Pipes, um die Ausgabe zu steuern, von denen Programme häufig annehmen, dass sie nicht interaktiv sind (sie sehen sie nicht als TTY / Konsole). Das Ergebnis ist, dass sie die Ausgabe aus Leistungsgründen häufig in 4-KB-Blöcken puffern. Habe noch keine generelle Lösung dafür gesehen.
Brian
Aber wenn ich schreibe, ping google.comsehe ich eine Echtzeit-Aktion davon
Dmitry Frank
Hängt vom Befehl / der ausführbaren Datei ab. Einige immer Zeilenpuffer sind also kein Problem.
Brian
Ich verwende Mercurial unter Cygwin und habe das beschriebene Problem nicht. Ist dies eine "native" Windows-Version von Mercurial oder Cygwins Version? Wenn das erstere, versuchen Sie das letztere.
Heptite
Dies ist eine "native" Windows-Version, ja. Es enthält einige nützliche Funktionen wie Überlagerungssymbole und TortoiseHG GUI, die in der Cygwin-Version nicht enthalten sind. Vielen Dank für den Vorschlag, ich bin für einige Tage nicht in meiner Entwicklungsumgebung, aber ich werde es auf jeden Fall später versuchen.
Dmitry Frank

Antworten:

1

Ich verwende Mercurial unter Cygwin und habe das beschriebene Problem nicht. Ist dies eine "native" Windows-Version von Mercurial oder Cygwins Version? Wenn das erstere, versuchen Sie das letztere.

Heptit
quelle
1

Ich weiß, dass dies ein alter Thread ist, aber ich habe dieses Problem in den letzten 3 Jahren erlebt. Und nach ungefähr einem Monat kam ich aus allen Nähten auseinander und konnte es nicht länger ertragen. Es mag ein wenig stumpf oder hartnäckig sein, aber es funktioniert ... und es funktioniert seit 2,75 Jahren ohne Probleme.

Das hat meinen Laptop davon abgehalten, auf der Straße zu landen

$ ln -s `where ping.exe | grep -v rh` /usr/bin/ping.exe

So bin ich dort angekommen ...

david@Covet ~
$ which ping.exe
/usr/bin/ping.exe

david@Covet ~
$ /usr/bin/ping.exe
Usage:  ping [-dfqrv] host [packetsize [count [preload]]]

david@Covet ~
$ where ping.exe
C:\rhcygwin64\bin\ping.exe
C:\Windows\System32\PING.EXE

david@Covet ~
$ mv /usr/bin/ping.exe /usr/bin/cyping.exe

david@Covet ~
$ ln -s `where ping.exe | grep -v rh` /usr/bin/ping.exe

david@Covet ~
$ which ping
/usr/bin/ping

david@Covet ~
$ ping

Usage: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
            [-r count] [-s count] [[-j host-list] | [-k host-list]]
            [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name

Options:
    -t             Ping the specified host until stopped.
                   To see statistics and continue - type Control-Break;
                   To stop - type Control-C.
    -a             Resolve addresses to hostnames.
    -n count       Number of echo requests to send.
    -l size        Send buffer size.
    -f             Set Don't Fragment flag in packet (IPv4-only).
    -i TTL         Time To Live.
    -v TOS         Type Of Service (IPv4-only. This setting has been deprecated
                   and has no effect on the type of service field in the IP Header).
    -r count       Record route for count hops (IPv4-only).
    -s count       Timestamp for count hops (IPv4-only).
    -j host-list   Loose source route along host-list (IPv4-only).
    -k host-list   Strict source route along host-list (IPv4-only).
    -w timeout     Timeout in milliseconds to wait for each reply.
    -R             Use routing header to test reverse route also (IPv6-only).
    -S srcaddr     Source address to use.
    -4             Force using IPv4.
    -6             Force using IPv6.

david@Covet ~
$ ping -t 8.8.8.8

Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=13ms TTL=54
Reply from 8.8.8.8: bytes=32 time=13ms TTL=54
Reply from 8.8.8.8: bytes=32 time=13ms TTL=54
Reply from 8.8.8.8: bytes=32 time=13ms TTL=54
Reply from 8.8.8.8: bytes=32 time=13ms TTL=54
Reply from 8.8.8.8: bytes=32 time=14ms TTL=54
Reply from 8.8.8.8: bytes=32 time=14ms TTL=54


david@Covet ~
$

Ich hoffe das hilft jemandem, jemand wie es mir geholfen hat.

David Dionne
quelle
0

Ich weiß, dass beim Implementieren von Befehlszeilencode in C / C ++ dieses Verhalten durch den Befehl fflush () gesteuert werden kann, um einen Ausgabepuffer zu leeren. Fclose () würde dasselbe tun.

Das hängt also davon ab, welches Programm Sie ausführen und wie oft sie flush () ausführen.

Der Dave
quelle