Redirect File Descriptor of Running Process
This note explains how to redirect
stdin (or any other file descriptor) of a
pre-existing process using the GNU debugger (
gdb) and a FIFO. It was tested
on FreeBSD 11.
An example of use would be saving the contents of remote
vi sessions after
they are detached due to a dropped connection.
First, make a FIFO:
$ mkfifo /tmp/vififo
Assuming there is a pre-existing
vi session with PID
gdb, close file descriptor
0 and reopen it as a connection to the
FIFO with the
call close and
call open commands.
$ gdb -p 91266 <snip> Attaching to process 91266 <snip> (gdb) call close (0) $1 = 0 (gdb) call open ("/tmp/vififo", 0600)
At this point
gdb will appear to hang. Leave it and open a new terminal. Use
echo to send characters to the process through the FIFO.
Special characters may be escaped by pressing
Ctrl-V followed by the
character. For example, to send an
Ctrl-V followed by
Escape which results in an
Escape code, or
Continuing the example, tell
vi to save the current buffer to a file.
$ echo "^[:w /tmp/vi_recover.txt" > /tmp/vififo
After this command the
gdb session should start responding again, returning
(gdb) prompt. Exit
$2 = 0 (gdb) quit A debugging session is active. Inferior 1 [process 91266] will be detached. Quit anyway? (y or n) Y Detaching from program: /hh/bin/vi, process 91266 [Inferior 1 (process 91266) detached]
The characters have now been received by
vi and a file should be waiting at