假设我有一个可执行程序 a.out ,两个终端分别为终端 A 、终端 B 。
现在我在终端 A 前台执行程序./a.out ,我如何不操作终端 A 、只操作终端 B,并且不结束 a.out 进程的情况下,让 a.out 在终端 B 中前台执行?
|  |      1FurN1      2021-09-22 19:52:42 +08:00 via iPhone  1 tmux 了解一下 | 
|  |      2hanxiV2EX      2021-09-22 19:53:02 +08:00 via Android  1 只想到了 tmux,让 A 和 B 都在 tmux 里跑 | 
|  |      3fullpowers      2021-09-22 20:01:29 +08:00  2 screen | 
|  |      4nanmu42      2021-09-22 20:15:38 +08:00 via iPhone  15 | 
|  |      5liuguangxuan OP | 
|  |      9mingl0280      2021-09-23 00:53:44 +08:00 tail -f /proc/<pid>/1 | 
|  |      10mingl0280      2021-09-23 00:54:02 +08:00  4 打错了 tail -f /proc/<pid>/fd/1 | 
|  |      11wangyu17455      2021-09-23 07:51:16 +08:00 screen | 
|      152i2Re2PLMaDnghL      2021-09-23 10:23:07 +08:00 @mingl0280 不行,你只能并入输出不能截取输出 比如如果你 yes > /dev/null 的话,你会发现 /proc/<pid>/fd/1 是指向 /dev/null 的符号链接 终端的话是指向 /dev/tty<n> 或 /dev/pts/<n> 的符号链接,你尝试打开并读取不会得到其他进程的输出。 | 
|  |      16wangyzj      2021-09-23 10:24:50 +08:00 screen | 
|  |      17Loku      2021-09-23 10:52:51 +08:00 screen +1 | 
|  |      18RobberPhex      2021-09-23 11:42:46 +08:00 可以试一下 reptyr | 
|      19t123yh      2021-09-23 14:37:45 +08:00 via Android reptyr +1 | 
|  |      20mingl0280      2021-09-23 15:13:08 +08:00 via Android @2i2Re2PLMaDnghL 这个确实,没法整。 | 
|      212i2Re2PLMaDnghL      2021-09-24 10:31:55 +08:00 @mingl0280 所以 #4 算是正解。 粗看了一下代码,发现了 gdb 。也就是说如果有抗拒被 gdb 插入的程序,是不能覆盖的 或者不是通过 stdout/stderr 而是重新把 pts/tty 打开的(虽然正常人不太会这么干),那也是不能覆盖的。 另外可以考虑用 ptrace 捕获 syscall,甚至 strace -p <pid> | post_processor 也是可以的。 |