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