最初,我尝试根据发现的信息xterm
将s追溯到xterm
pid,/proc/locks
但这很松散。我的意思是,它起作用了,但我认为它只是出于环境的考虑-我不完全理解文件提供的所有信息,而只是匹配文件内容和已知终端进程之间似乎对应的内容。
然后,我尝试观察pty之间lsof/strace
的活动write/talk
进程。我以前从未实际使用过任何程序,但是它们似乎依赖于utmp
。如果我的目标个人utmp
出于任何原因没有条目,他们都会拒绝承认该条目的存在。也许有办法解决,但我很困惑,无法放弃。
我尝试分别在udevadm
136和128个主要设备节点上进行发现pts
,ptm
分别在中进行了发现/proc/tty/drivers
,但是我也对该工具缺乏任何非常有用的经验,并且再次没有发现任何实质性的内容。不过,有趣的是,我注意到:min
两种设备类型的范围都以惊人的幅度列出0-1048575
。
直到我重新访问了此内核文档后,我才开始考虑mount
s 的问题。我之前已经读过好几次书,但是当我继续对该领域的研究使我想到了这个2012年的/dev/pts
补丁集时,我有了一个主意:
sudo fuser -v /dev/ptmx
我以为我通常使用什么将流程与mount
?当然可以:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
因此,有了这些信息,我就可以做到,例如terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
如您所见,只需进行一些显式测试,就可以非常可靠地输出任意pty的主过程。关于套接字,我相当肯定可以使用socat
调试器而不是调试器来解决这个问题,但是我还没有弄清楚如何做。不过,我怀疑ss
如果您比我更熟悉它,可能会有所帮助:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
因此,我实际上进行了一些更明确的测试来设置它:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
它向每个pty 打印$$
num个\0
空字节,并根据先前的检查来检查每个主进程的io。如果不同,$$
则它将pid与pty关联。这大多有效。我的意思是,对我来说,它返回:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
这是正确的,但显然有点不礼貌。我的意思是,如果其中一个人当时正在读取大量数据,则可能会丢失。我试图弄清楚如何更改stty
另一个pty上的模式,以便首先发送停止位或类似的东西,以便我可以解决该问题。
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
,将提供PID(/proc/PID
)列表作为输出。