+# 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 `91266`, connect
+with `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 `Escape`, press `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
+to a `(gdb)` prompt. Exit `gdb`.
+
+ $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
+`/tmp/vi_recover.txt`.