2016-08-02 13 views
1

Zur Steuerung der Ausgabe unter Linux gibt es control-s und control-t, die eine Methode zum vorübergehenden Anhalten der Terminalausgabe und dann zum Fortsetzen der Ausgabe bereitstellen. Auf VMS zusätzlich gab es control-O, das alle Ausgaben ein- und ausschalten würde. Dies hat die Ausgabe nicht unterbrochen, sondern verworfen.Interaktiv ein- und ausschalten unter Linux?

Gibt es eine entsprechende Tastenkombination in Linux?

Dies kommt am häufigsten für mich in gdb, wenn Sie Programme debuggen, die Millionen von Statuszeilen ausgeben. Es wäre sehr praktisch, die meisten davon zeitweise an/dev/null anstatt an den Bildschirm senden zu können, und dann mit dem Ausgabestrom weiterzuspielen, wobei dazwischen ein paar Millionen Zeilen weggelassen wurden.

(Bearbeitet: Die Manpage von termios (3) erwähnt VDISCARD - und sagt dann, dass es in POSIX oder Linux nicht funktioniert. Es sieht also so aus, als käme das für die allgemeine Kommandozeile unter Linux nicht in Frage gdb kann die Ausgabe trotzdem durch einen eigenen Befehl verwerfen, oder?)

Vielen Dank.

Antwort

0

Auf VMS zusätzlich gibt Steuer-O ...

war

Diese Funktionalität wird nicht angezeigt, existiert auf jedem UNIX-System, das ich jemals mit (oder vielleicht auch nur es nie, dass ich behandelt habe wusste existiert zB in FreeBSD man page und wird auch von Solaris- und HP-UX-Dokumenten referenziert.

gdb könnte immer noch in der Lage sein, die Ausgabe durch einen eigenen Befehl zu verwerfen. Kann es?

Ich glaube nicht so: GDB nicht wirklich die Ausgabe von dem unteren abfangen (gedebuggt) Prozess, macht es einfach (zwischen Haltepunkten) mit dem unteren Ausgang laufen zu gehen, wo immer es geht.

Das heißt, Sie könnte es selbst tun:

#include <stdio.h> 
int main() 
{ 
    int i; 
    for (i = 0; i < 1000; ++i) { 
    printf("%d\n", i); 
    } 
} 

gcc -g foo.c 
gdb -q ./a.out 

(gdb) break 6 
Breakpoint 1 at 0x40053e: file foo.c, line 6. 

(gdb) run 20>/dev/null # run the program, file descriptor 20 goes to /dev/null 

Starting program: /tmp/a.out 20>/dev/null 

Breakpoint 1, main() at foo.c:6 
6  printf("%d\n", i); 
(gdb) c 
Continuing. 
0 

Breakpoint 1, main() at foo.c:6 
6  printf("%d\n", i); 

Wir haben jetzt zwei Iterationen laufen. Lassen Sie uns weitere Ausgaben für 100 Iterationen verhindern:

(gdb) call dup2(20, 1) 
$1 = 1 
(gdb) ign 1 100 
Will ignore next 100 crossings of breakpoint 1. 
(gdb) c 
Continuing. 

Breakpoint 1, main() at foo.c:6 
6  printf("%d\n", i); 
(gdb) p i 
$2 = 102 

Keine Ausgabe, wie gewünscht. Jetzt stellen wir die Ausgabe wieder her:

(gdb) call dup2(2, 1) 
$3 = 1 
(gdb) ign 1 10 
Will ignore next 10 crossings of breakpoint 1. 
(gdb) c 
Continuing. 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 

Breakpoint 1, main() at foo.c:6 
6  printf("%d\n", i); 

Ausgabe wiederhergestellt!

+0

Wenn die Ausgabe des Programms zu stout ist, mit Warnungen und Fehlermeldungen zu stderr, wird nicht mit dup2 auf denen auch mist herauf den Weg gdb selbst funktioniert? – mathog

+0

Wenn Sie "dup2" aufrufen, führt der Aufruf * nur * im minderwertigen Prozess aus. GDB selbst wird völlig unberührt sein (warum versuchst du es nicht einfach). –