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