I / O-Umleitung mit cygwin und mingw

2100
KLee1

Ich habe ein Programm in C geschrieben und es mit MinGW kompiliert. Wenn ich versuche, das Programm in Cygwin auszuführen, scheint es sich normal zu verhalten (dh es werden korrekte Ausgaben gedruckt usw.).

Ich versuche jedoch, die Ausgabe an ein Programm zu übergeben, damit ich Informationen aus der Programmausgabe analysieren kann. Das Piping scheint jedoch nicht zu funktionieren, da ich keine Eingaben in das zweite Programm bekomme.

Ich habe dies mit den folgenden Befehlen bestätigt:

Dieser Befehl scheint gut zu funktionieren:

./prog 

Wenn Sie diesen Befehl ausführen, wird nichts zurückgegeben:

./prog | cat 

Dieser Befehl überprüft die erste:

./prog | wc 

Welche gibt zurück:

0 0 0 

Ich weiß, dass das Skript (einschließlich des Pipings aus dem Programm) in einer Linux-Umgebung einwandfrei funktioniert.

Hat jemand eine Idee, warum die Verrohrung in Cygwin nicht funktioniert? Vielen Dank!

3
Bekommen Sie dasselbe Verhalten, indem Sie es an "more" weiterleiten oder "stdout" in eine tatsächliche Datei umleiten? Breakthrough vor 13 Jahren 0
@ Durchbruch Ja. Die Ausgabe in eine Datei "./prog &> output.txt" oder "./prog> output.txt" führt zu einer leeren output.txt KLee1 vor 13 Jahren 0
ein paar fragen: drucken sie auf stdout? Drucken Sie das rechte Zeilenende für Windows (\ r \ n)? Pablo Castellazzi vor 13 Jahren 0
@Pablo Castellazzi Ich drucke auf stdout (nur mit printf), benutze aber "\ n" anstelle von "\ r \ n". Ich denke nicht, dass das die Tatsache ändern sollte, dass ich bei al keine Ausgabe bekomme, richtig? Ich werde versuchen, die Zeilenenden in \ r \ n zu ändern und es Ihnen mitzuteilen. KLee1 vor 13 Jahren 0
Ich habe gerade eine kleine C-App geschrieben, die printf verwendet und in der Lage war, an WC und weniger und dergleichen zu pfeifen. Welche Version von Cygwin laufen Sie? Robb vor 13 Jahren 0
Sie sollten Ihren Quellcode verlinken Steven Penny vor 12 Jahren 0
Das Programm kann "/ dev / tty" öffnen und darauf schreiben. Das ist die einzige Erklärung, die ich mir für dieses Verhalten vorstellen kann. Fran vor 12 Jahren 0
Ich glaube, das Problem war, dass ich den Ausgabestrom `fflush (stdout) 'in meiner Anwendung nicht geleert habe, was dazu führte, dass die Daten nicht in die Datei ausgegeben wurden, sondern ordnungsgemäß auf dem Bildschirm (\ n Zeilenumbrüche). KLee1 vor 12 Jahren 0
Die Spülung würde es erklären. Beim Schreiben in eine Pipe wird stdout blockweise gepuffert (z. B. jeweils 4096 Byte, sodass der erste Block erst geschrieben wird, wenn das 4097. Byte geschrieben ist). Beim Schreiben auf ein Terminal wird stdout jedoch zeilenweise gepuffert (dh Jede Newline spült die Puffer). Fran vor 12 Jahren 0

1 Antwort auf die Frage

0
Moreaki

Most probably this has to do with stdio buffering, as identified and explained previously in the comments section. In my MinGW projects, I have often used the following construct:

#define disable_stdout_buffering() do { \ setvbuf(stdout, NULL, _IONBF, 0); } while(0)  int main(int argc, char *argv[]) { disable_stdout_buffering(); /* Your code */ exit(EXIT_SUCCESS); } 

Of course you can also add a call to fflush() in a preprocessor macro or when you output your data to stdout, however this way it does not add an additional library call to each buffer written to your console.