假设我有一个可执行程序 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
tmux 了解一下
|
|
2
只想到了 tmux,让 A 和 B 都在 tmux 里跑
|
|
3
screen
|
|
4
|
|
5
|
|
mingl0280Sep 23, 2021
9
tail -f /proc/<pid>/1
|
|
10
打错了
tail -f /proc/<pid>/fd/1 |
|
wangyu17455Sep 23, 2021
11
screen
|
|
2i2Re2PLMaDnghLSep 23, 2021
15
@mingl0280 不行,你只能并入输出不能截取输出
比如如果你 yes > /dev/null 的话,你会发现 /proc/<pid>/fd/1 是指向 /dev/null 的符号链接 终端的话是指向 /dev/tty<n> 或 /dev/pts/<n> 的符号链接,你尝试打开并读取不会得到其他进程的输出。 |
|
wangyzjSep 23, 2021
16
screen
|
|
LokuSep 23, 2021
17
screen +1
|
|
RobberPhexSep 23, 2021
18
可以试一下 reptyr
|
|
t123yhSep 23, 2021 via Android
19
reptyr +1
|
|
mingl0280Sep 23, 2021 via Android
20
@2i2Re2PLMaDnghL 这个确实,没法整。
|
|
2i2Re2PLMaDnghLSep 24, 2021
21
@mingl0280 所以 #4 算是正解。
粗看了一下代码,发现了 gdb 。也就是说如果有抗拒被 gdb 插入的程序,是不能覆盖的 或者不是通过 stdout/stderr 而是重新把 pts/tty 打开的(虽然正常人不太会这么干),那也是不能覆盖的。 另外可以考虑用 ptrace 捕获 syscall,甚至 strace -p <pid> | post_processor 也是可以的。 |