Leiten Sie die Eingabe von einem Terminal zum anderen um

17475
Niki Yoshiuchi

Ich habe in eine Linux-Box eingebettet und benutze dvtm und bash (obwohl ich dies auch mit Gnu screen und bash probiert habe). Ich habe zwei Terminals, Strom / dev / pts / 29 und / dev / pts / 130. Ich möchte die Eingabe von einem zum anderen umleiten.

Was ich verstehe, kann ich in / dev / pts / 130 eingeben:

cat </dev/pts/29 

Wenn ich dann / dev / pts / 29 eingebe, sollten die eingegebenen Zeichen in / dev / pts / 130 erscheinen. Was jedoch am Ende passiert, ist, dass jeder andere Charakter, den ich tippe, umgeleitet wird. Wenn ich beispielsweise "Hallo" eingebe, erhalte ich Folgendes:

/dev/pts/29 | /dev/pts/130  $ | $ cat </dev/pts/29 $ el | hlo 

Dies ist wirklich frustrierend, da ich dies tun muss, um das Io eines Prozesses umzuleiten, der in gdb ausgeführt wird das vorgenannte Verhalten). Mache ich etwas falsch oder ist das ein Fehler in bash / screen / dvtm?

7

1 Antwort auf die Frage

8
Chris Johnsen

In your simplified example, you have two processes (your shell, and the cat) trying to read from the “slave” side of the tty. The result is that one process gets some of the characters, the other gets the others.

What do you mean by “redirect the input from one [terminal] to the other”? In your real situation, what processes are trying to read from each terminal? What do you want to do with your captured input once you have it? What, exactly, are you actually trying to accomplish?

To me, “redirect the io of a process running in gdb” seems more like re-opening stdin/stdout/stderr inside a process that is already running.

You can change stdin/stdout/stderr of a running process with (among other things) GDB. An answer to “Redirect STDERR / STDOUT of a process AFTER it’s been started, using command line?” shows how it can be done. You would want to substitute a tty pathname for /dev/null in the answer, and you probably want to handle stdin, too, but the technique is still applicable.


You should be able to make your simplified example work robustly, but I am not convinced that it does what you actually want to do (keep in mind that a pseudo terminal is actually a pair of devices, like two ends of a bidirectional pipe; but all your example does it interact with the ‘slave’ halves).

The key to fixing your example is to get all but one of the competing process to (temporarily) stop read from the terminal. If, like your example, you have a shell running on the side from which you would like to capture data, then you can do something like this:

( s="$(stty -g)" exec 3<&0 trap 'stty "$s" 0<&3;exit' 0 INT QUIT cat <<EOM In some other terminal, run the command cat <$(tty) Press ^C or ^\ to quit. EOM stty raw isig brkint susp '' dsusp '' while true; do sleep 3600; done </dev/null ) 
Mein Ziel war es, einen Prozess in gdb auszuführen, aber mit dem Prozess in einem anderen Terminal zu interagieren. Dies wurde veranlasst, weil ich pyclewn eingerichtet habe, und wenn es in einem Terminal ausgeführt wird, wird der Prozess 'io nach / dev / null umgeleitet, sodass keine Interaktion möglich ist. Ich habe jedoch gerade gemerkt, dass ich ein Idiot bin, da ich gdb einfach an einen Prozess anschließen kann, der in einem separaten Terminal ausgeführt wird und mein Problem vollständig umgeht. Niki Yoshiuchi vor 13 Jahren 0
Ich habe auch dies gesucht (Debug-Flüche mit Flüchen). Es verdient sich eine einzige Erklärung. Speichern Sie das alte stdin, laden Sie das alte stdin nach dem Beenden und am besten die ungepufferte Eingabe. Auf Ubuntu funktioniert es trotzdem nicht perfekt. Beim Beenden ist ein Reset erforderlich, aber die Verwendung des Mannes sollte ausreichen, um ihn zu optimieren. albfan vor 9 Jahren 0