假设我有一个可执行程序 a.out ,两个终端分别为终端 A 、终端 B 。
现在我在终端 A 前台执行程序./a.out ,我如何不操作终端 A 、只操作终端 B,并且不结束 a.out 进程的情况下,让 a.out 在终端 B 中前台执行?
假设我有一个可执行程序 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 也是可以的。 |